Lightoj 1031 区间DP

来源:互联网 发布:淘宝客活动可以取消吗 编辑:程序博客网 时间:2024/05/16 19:47

这里 每次向下深入的时候通过 减掉 向下的DFS值来模拟交替取值!

而且注意 注释的地方!

dp[i][j]表示i-j之间两者取值的最大差值!

AC代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAX 0x3f3f3f3fint dp[101][101];int N;int sum[110];int DFS( int left, int right ){if( left > right ){return 0;}if( dp[left][right] != -MAX ){return dp[left][right];}dp[left][right] = sum[right] - sum[left-1];for( int i = left; i <= right; i++ ){dp[left][right] = max( dp[left][right], sum[i] - sum[left-1] - DFS( i + 1, right ) );dp[left][right] = max( dp[left][right], sum[right] - sum[i-1] - DFS( left, i-1 ) );//注意这里的i-1  用从左还是从右来包括i才能做到不重不漏}//而且 这里 每次都 通过 -DFS  来做到交替!!!return dp[left][right];}int main(){int T, Case = 1;cin >> T;while( T-- ){cin >> N;for( int i = 1; i <= N; i++ ){for( int j = 1; j <= N; j++ ){dp[i][j] = -MAX;}}for( int i = 1; i <= N; i++ ){cin >> sum[i];dp[i][i] = sum[i];}sum[0] = 0;for( int i = 1; i <= N; i++ ){sum[i] += sum[i-1];}cout << "Case " << Case++ << ": " << DFS( 1, N ) << endl;}return 0;}