bzoj 3997: [TJOI2015]组合数学

Posted Boss.Pi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 3997: [TJOI2015]组合数学相关的知识,希望对你有一定的参考价值。

Description

给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走。问至少走多少次才能将财宝捡完。此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完

Solution

\(x\) 这个点不能顺路走到 \(y\) 当且仅当 \(y\)\(x\) 的右上角
答案就是从左下角走到右上角的"最长路",即最长不能一次性走完的路径,其余的显然都可以顺路走掉
用一个简单DP求出 "最长路" 即可

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,a[N][N],f[N][N];
void work(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)scanf("%d",&a[i][j]),f[i][j]=0;
    for(int i=n;i>=1;i--){
        for(int j=1;j<=m;j++){
            f[i][j]=max(f[i][j],f[i+1][j-1]+a[i][j]);
            f[i][j]=max(f[i][j],f[i+1][j]);
            f[i][j]=max(f[i][j],f[i][j-1]);
        }
    }
    printf("%d\n",f[1][m]);
}
int main(){
  freopen("pp.in","r",stdin);
  freopen("pp.out","w",stdout);
  int T;cin>>T;
  while(T--)work();
  return 0;
}

以上是关于bzoj 3997: [TJOI2015]组合数学的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ3997 TJOI2015 组合数学

BZOJ3997[TJOI2015]组合数学 最长反链

BZOJ 3997 [TJOI2015]组合数学(单调DP)

bzoj3997: [TJOI2015]组合数学

bzoj 3997: [TJOI2015]组合数学

bzoj3997 [TJOI2015]组合数学