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 ;
}
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 ;
}