Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1819 Accepted Submission(s): 921
把二维按行列分解然后dp。
dp[i][0] 表示不取第i个能到的最大值
所以dp[i][0] = Max(dp[i-1][0],dp[i-1][1]);
dp[i][1] 表示取第i个能到的最大值
所以dp[i][1] = dp[i-1][0]+value[i];
row[i]记录下每一行的最优情况,然后再按照上面的方法进行dp
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=200010; int m,n; int dp[N][2],val[N],row[N]; int main(){ //freopen("input.txt","r",stdin); while(~scanf("%d%d",&m,&n)){ memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ scanf("%d",&val[j]); dp[j][0]=max(dp[j-1][0],dp[j-1][1]); dp[j][1]=dp[j-1][0]+val[j]; } row[i]=max(dp[n][0],dp[n][1]); } for(int i=1;i<=m;i++){ dp[i][0]=max(dp[i-1][0],dp[i-1][1]); dp[i][1]=dp[i-1][0]+row[i]; } printf("%d\n",max(dp[m][0],dp[m][1])); } return 0; }
#include<stdio.h> #include<string.h> const int maxn=200010; int dp_row[maxn][2]; int dp_col[maxn][2]; int max(int a,int b){ return a>b?a:b; } int main(){ //freopen("input.txt","r",stdin); int m,n; while(scanf("%d%d",&m,&n)!=EOF){ memset(dp_row,0,sizeof(dp_row)); memset(dp_col,0,sizeof(dp_col)); int tmp; for(int i=1;i<=m*n;i++){ scanf("%d",&tmp); if(i%n==1){ dp_row[i][0]=0; dp_row[i][1]=tmp; }else{ dp_row[i][0]=max(dp_row[i-1][0],dp_row[i-1][1]); dp_row[i][1]=dp_row[i-1][0]+tmp; } } for(int i=1;i<=m;i++){ dp_col[i][0]=max(dp_col[i-1][0],dp_col[i-1][1]); dp_col[i][1]=dp_col[i-1][0]+max(dp_row[i*n][0],dp_row[i*n][1]); } printf("%d\n",max(dp_col[m][0],dp_col[m][1])); } return 0; }