#include<bits/stdc++.h>usingnamespace std;constint maxn =1010;constint maxv =20008;int n;int h[maxn];longlong dp[maxn][2*maxv];//dp[i][j]是以第i项结尾的差为j的等差序列方案数 int mod =998244353;longlong ans=0;intmain(){scanf("%d",&n);for(int i =1;i<=n;i++){scanf("%d",&h[i]);}for(int i=2;i<=n;i++){for(int j=1;j<i;j++){
dp[i][h[i]-h[j]+20000]=(dp[i][h[i]-h[j]+20000]+dp[j][h[i]-h[j]+20000]+1)%mod;
ans =(ans+dp[j][h[i]-h[j]+20000]+1)%mod;//+1为h[i]和h[j]两个电塔组成的方案 }}
ans =(ans+n)%mod;//n个只有一个电塔的方案 printf("%lld\n",ans);return0;}
P1233 木棍加工
#include<bits/stdc++.h>usingnamespace std;constint maxn =10010;//const int maxv = 20008; struct goods{int l,w;}good[maxn];int n,ans=0;int dp[maxn];boolcmp(goods a,goods b){if(a.l!=b.l)return a.l>b.l;elsereturn a.w>b.w;}intmain(){scanf("%d",&n);for(int i =1;i<=n;i++){scanf("%d %d",&good[i].l,&good[i].w);}sort(good+1,good+1+n,cmp);//按第一维l排序for(int i=1;i<=n;i++){
dp[i]=1;for(int j=1;j<i;j++){if(good[i].w>good[j].w){
dp[i]=max(dp[i],dp[j]+1);}}
ans =max(ans,dp[i]);}
cout<<ans<<endl;return0;}