UVA 10891 Game of Sum
2014-09-09 17:13
281 查看
这个题就是 动规, 由于题目描述 左边拿 右边拿、 所以数组很容易构造, d【i】【j】 来表示 从第 i 个数 到 第 j 个数, 最大的数值。
这样 状态转移方程就好写了、 d(i,j) = sum【i】【j】 - min(d(i+1,j),d(i+2,j)......);
顺便用记忆话搜索。
这样 状态转移方程就好写了、 d(i,j) = sum【i】【j】 - min(d(i+1,j),d(i+2,j)......);
顺便用记忆话搜索。
#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <string> #include <map> #include <vector> #include <set> #include <queue> #include <stack> #include <cctype> using namespace std; #define ll long long typedef unsigned long long ull; #define MAXN 100 + 10 int d[MAXN][MAXN]; int vis[MAXN][MAXN]; int s[MAXN] = {0}; int dp(int a, int b){ if(vis[a][b]) return d[a][b]; vis[a][b] = 1; int m = 0; for(int k = a+1; k <= b; k++) m = min(m, dp(k, b)); for(int k = a; k < b; k++) m = min(m, dp(a, k)); d[a][b] = s[b] - s[a-1] - m; return d[a][b]; } int main (){ int n; while(scanf("%d",&n) != EOF && n){ int a; memset(vis,0,sizeof(vis)); s[0] = 0; for(int i = 1; i <= n; i++){ scanf("%d",&a); s[i] = s[i-1] + a; } int x = dp(1,n); printf("%d\n",2*x - s ); } return 0; }
相关文章推荐
- UVA 10891 Game of Sum(区间DP)
- uva 10891 game of sum
- UVA10891- Game of Sum
- 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(区间DP)
- 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
- uva10891 Game of Sum(博弈+区间dp+优化)
- UVA 10891 Game of Sum(区间博弈dp)***
- uva10891 - Game of Sum(递推,极大极小的思想)
- UVA 10891 Game of Sum(区间DP)
- uva10891 Game of Sum 博弈区间dp
- UVa10891 Game of Sum(dp)
- UVA 10891 Game of Sum