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=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
int T,n,m,x;
read(T);
while(T--)
{
read(n); read(m);
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
read(a[i][j]);
memset(dp,,sizeof(dp));
for(int i=;i<=n;++i)
for(int j=m;j;--j)
dp[i][j]=max(dp[i-][j+]+a[i][j],max(dp[i-][j],dp[i][j+]));
cout<<dp[n][]<<'\n';
}
}