最长反链=最小链覆盖。
http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/
By:大奕哥
1 #include<bits/stdc++.h> 2 using namespace std; 3 int T,n,m,f[1005][1005],a[1005][1005]; 4 int main() 5 { 6 scanf("%d",&T); 7 while(T--) 8 { 9 scanf("%d%d",&n,&m); 10 memset(f,0,sizeof(f)); 11 for(int i=1;i<=n;++i) 12 for(int j=1;j<=m;++j) 13 scanf("%d",&a[i][j]); 14 for(int j=1;j<=m;++j) 15 for(int i=n;i;--i) 16 f[i][j]=max(f[i][j],max(max(f[i+1][j],f[i+1][j-1]+a[i][j]),f[i][j-1])); 17 printf("%d\n",f[1][m]); 18 } 19 return 0; 20 }