HDU 2845 Beans
这题属于最大不连续字段和。
因为它是二维的所以把第i行做一次线性dp,压成dp[i]来储存,再在dp数组中做一次最大不连续字段和求答案就好啦,一道二维的题目,秒变一维的。
状态表示:dp[i]代表第i行在做最大不连续字段和的最终值。
转移方程:当i大于2——如果dp[i]从它的前一位转移而来那么它的值便是dp[i-1],如果dp[i]从第i-2位转移而来它的值便是dp[i-2]+dp[i],在二者中取最大值(满足最优子结构):dp[i]=max(dp[i-1],dp[i-2]+dp[i]);
#include<bits/stdc++.h> using namespace std; const int N=200000+5; int n,m,a[N],dp[N]; int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) scanf("%d",&a[j]); for(int j=2;j<=m;j++) a[j]=max(a[j-2]+a[j],a[j-1]); dp[i]=a[m]; } for(int i=2;i<=n;i++) dp[i]=max(dp[i-2]+dp[i],dp[i-1]); printf("%d\n",dp[n]); } return 0; }
浙公网安备 33010602011771号