bzoj千题计划298:bzoj3997: [TJOI2015]组合数学(偏序)

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]<<'\n';
    }
}

 

posted @ 2018-03-20 21:40  TRTTG  阅读(179)  评论(0编辑  收藏  举报