http://acm.hdu.edu.cn/showproblem.php?pid=2845
由于数据庞大,决不能直接DFS了,根据题目的特点,发现先对每一行DP,把每一行的最大值保存到
一个数组中,再对这个数组DP一下,双重DP,不过用的同一个DP公式,挺有意思的~~~
DP公式:dp[i]=max{dp[j](j<=i-2)}+w[i];
#include<iostream>
using namespace std;
//dp1[]用来求出每一行的最大值,将最大值存入dp[2]中
//最后再对dp2[]DP,就可求得整体最大值
int dp1[200010],dp2[200010];
//对dp[]数组dp,公式为dp[i]=max{dp[j](j<=i-2)}+w[i];
int dpMax(int dp[],int n){
int max = dp[1];
int temp;
for(int i=3;i<=n;i++){//得从3开始,晕死,一开始错了!
temp = dp[1];
for(int j=1;j<=i-2;j++)
if(dp[j]>temp)temp=dp[j];
dp[i]=temp+dp[i];
if(dp[i]>max)max=dp[i];
}
return max;
}
int main(){
int m,n;
while(scanf("%d%d",&m,&n)!=EOF){
for(int i=1;i<=m;i++){
//没输入一行求一次DP,并将最大值存入dp2[]中
for(int j=1;j<=n;j++)
scanf("%d",&dp1[j]);
dp2[i]=dpMax(dp1,n);
}//最后再对dp2[]DP,就可求得整体最大值
cout<<dpMax(dp2,m)<<endl;
}
return 0;
}