1. 程式人生 > >bzoj3997 [TJOI2015]組合數學

bzoj3997 [TJOI2015]組合數學

source 一行 數量 -- 一個 bzoj3 max ems 其中

3997: [TJOI2015]組合數學

Time Limit: 20 Sec Memory Limit: 128 MB

Description

給出一個網格圖,其中某些格子有財寶,每次從左上角出發,只能向下或右走。問至少走多少次才能將財寶撿完。此對此問題變形,假設每個格子中有好多財寶,而每一次經過一個格子至多只能撿走一塊財寶,至少走多少次才能把財寶全部撿完。

Input

第一行為正整數T,代表數據組數。

每組數據第一行為正整數N,M代表網格圖有N行M列,接下來N行每行M個非負整數,表示此格子中財寶數量,0代表沒有

Output

輸出一個整數,表示至少要走多少次。

Sample Input

1
3 3
0 1 5
5 0 0
1 0 0

Sample Output

10

HINT

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]組合數學