标签:说明 组合数学 提高 超过 std 表示 -o 数学 name
为了提高智商,ZJY开始学习组合数学。某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝。每次从左上角出发,只能往右或下走。问至少要走几次才可能把财宝全捡完。
但是她还不知足,想到了这个问题的一个变形:假设每个格子中有好多块财宝,而每一次经过一个格子至多只能捡走一块财宝,其他条件不变,至少要走几次才可能把财宝全捡完?
这次她不会做了,你能帮帮她吗?
输入格式:
第一行为一个正整数t,表示数据组数
每组数据的第一行是两个正整数n和m,表示这个网格图有n行m列。
接下来n行,每行m个非负整数,表示这个格子中的财宝数量(0表示没有财宝)。
输出格式:
对于每组数据,输出一个整数,表示至少走的次数。
对于30%的数据,n≤5.m≤5,每个格子中的财宝数不超过5块。
对于50%的数据,n≤100,m≤100,每个格子中的财宝数不超过1000块
对于100%的数据,n≤1000,m≤1000,每个格子中的财宝不超过10^6块
首先你得知道一个定理(不用知道怎么证明):最长反链长度 = 最小链覆盖数
最长反链长度 = 最小链覆盖数:
大前提:在有向无环图中
#include<cstdio> #include<algorithm> using namespace std; int t,a[1005][1005],f[1005][1005]; int main() { scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); for(int i=n;i>=1;i--) for(int j=1;j<=m;j++) f[i][j]=max(f[i+1][j],max(f[i][j-1],f[i+1][j-1]+a[i][j])); printf("%d\n",f[1][n]); } return 0; }
标签:说明 组合数学 提高 超过 std 表示 -o 数学 name
原文地址:https://www.cnblogs.com/chenjiaxuan/p/10700696.html