http://www.lydsy.com/JudgeOnline/problem.php?id=3997
最小链覆盖=最长反链长度
所以题目等价于寻找一条从右上角到左下角的最长路
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 1002 int a[N][N]; long long dp[N][N]; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } int main() { int T,n,m,x; read(T); while(T--) { read(n); read(m); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) read(a[i][j]); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;++i) for(int j=m;j;--j) dp[i][j]=max(dp[i-1][j+1]+a[i][j],max(dp[i-1][j],dp[i][j+1])); cout<<dp[n][1]<<' '; } }