HDU 2845 Beans
DP。
先dp处理出每一行能得到的最大价值,再dp选择哪几行获得最大价值。
行列选择的本质是一样的操作。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=200000+10; int n,m; long long a[maxn],f[maxn],dp[maxn][2]; long long b[maxn]; long long work(int len) { long long res=0; dp[0][0]=dp[0][1]=0; for(int i=1;i<=len;i++) { dp[i][0]=max(dp[i-1][1],dp[i-1][0]); dp[i][1]=dp[i-1][0]+b[i]; res=max(res,max(dp[i][0],dp[i][1])); } return res; } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1; i<=n*m; i++) scanf("%lld",&a[i]); int cnt=0,hang=1; for(int i=1;i<=n*m;i++) { b[++cnt]=a[i]; if(cnt==m) { f[hang++]=work(m); cnt=0; } } for(int i=1;i<=n;i++) b[i]=f[i]; printf("%lld\n",work(n)); } return 0; }