bzoj3997 [TJOI2015]組合數學
阿新 • • 發佈:2017-09-17
source 一行 數量 -- 一個 bzoj3 max ems 其中
1
3 3
0 1 5
5 0 0
1 0 0
3997: [TJOI2015]組合數學
Time Limit: 20 Sec Memory Limit: 128 MBDescription
給出一個網格圖,其中某些格子有財寶,每次從左上角出發,只能向下或右走。問至少走多少次才能將財寶撿完。此對此問題變形,假設每個格子中有好多財寶,而每一次經過一個格子至多只能撿走一塊財寶,至少走多少次才能把財寶全部撿完。
Input
第一行為正整數T,代表數據組數。
每組數據第一行為正整數N,M代表網格圖有N行M列,接下來N行每行M個非負整數,表示此格子中財寶數量,0代表沒有Output
輸出一個整數,表示至少要走多少次。
Sample Input
3 3
0 1 5
5 0 0
1 0 0
Sample Output
10HINT
N<=1000,M<=1000.每個格子中財寶數不超過10^6
Source
Tips: 自己推一些可以得到: dp[i][j]=max(dp[i-1][j+1]+a[i][j],dp[i-1][j],dp[i][j+1]); Code:
#include<bits/stdc++.h> using namespace std; int n,m,t,dp[1008][1008],a[1008][1008]; int main(){ scanf("%d",&t);for(int i=1;i<=t;i++){ memset(dp,0,sizeof(dp)); 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=1;i<=n;i++) for(int j=m;j>0;j--) dp[i][j]=max(dp[i-1][j+1]+a[i][j],max(dp[i-1][j],dp[i][j+1])); printf("%d\n",dp[n][1]); } }
bzoj3997 [TJOI2015]組合數學