UVa 10891 Game of Sum / 记忆化搜索
2014-01-01 10:35
344 查看
记忆化搜索
dp[i][j] 表示第i~j个元素组成的子序列 先手得分的最大值
dp[i][j] = sum(i,j) - min(dp[i+1][j],dp[i+2][j],.....dp[j][j],dp[i][j-1],dp[i][j-2],.....dp[i][i],0) ,0 代表取完所有数
dp[i][j] 表示第i~j个元素组成的子序列 先手得分的最大值
dp[i][j] = sum(i,j) - min(dp[i+1][j],dp[i+2][j],.....dp[j][j],dp[i][j-1],dp[i][j-2],.....dp[i][i],0) ,0 代表取完所有数
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX = 110; int dp[MAX][MAX]; bool vis[MAX][MAX]; int a[MAX]; int sum[MAX]; int dfs(int s,int e) { if(vis[s][e]) return dp[s][e]; vis[s][e] = true; int k; int m = 0; for(k = s + 1; k <= e; k++) m = min(m,dfs(k,e)); for(k = s; k < e; k++) m = min(m,dfs(s,k)); dp[s][e] = sum[e] - sum[s-1] - m; return dp[s][e]; } int main() { int n; int i; while(scanf("%d",&n),n) { for(i = 1;i <= n; i++) { scanf("%d",&a[i]); sum[i] = sum[i-1] + a[i]; } memset(vis,false,sizeof(vis)); printf("%d\n",2*dfs(1,n)-sum ); } return 0; }
相关文章推荐
- UVA 10891 Game of Sum dp(记忆化搜索)
- UVA - 10891 Game of Sum(记忆化搜索 区间dp)
- UVA10891 Game of Sum
- UVa 10891 Game of Sum(博弈区间DP)
- [动态规划] Sum游戏 ( Game of Sum, Uva 10891 )
- UVA 10891 Game of Sum(区间DP)
- uva 10891 - Game of Sum
- uva_10891 - Game of Sum( 博弈区间DP )
- UVA - 10891 Game of Sum
- UVA 10891 Game of Sum(dp博弈)
- UVA 10891 Game of Sum
- UVA-10891 - Game of Sum
- uva 10891 - Game of Sum
- uva 10891 Game of Sum (DP水题)
- UVA 10891 Game of Sum(区间DP)
- UVa 10891 - Game of Sum
- Uva - 10891 - Game of Sum
- UVA 10891 Game of Sum(区间博弈dp)***
- UVA 10891 Game of Sum(区间DP)
- UVA 10891 Game of Sum