UVA - 10891 Game of Sum 区间DP(博弈DP)循环写法
2017-08-14 16:36
351 查看
跟上一篇博文一样,都是这个题,上一篇用递归的方式写的,这一篇用循环的方式求dp [ i ] [ j ] ——- i - j 区间的某个人最大的取值
详解见上篇,理解区间与从左从右开始的子区间之间的关系就会这个题了
详解见上篇,理解区间与从左从右开始的子区间之间的关系就会这个题了
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<math.h> #include<set> #include<stack> #include<queue> #include<ctype.h> #include<vector> #include<algorithm> #define PI acos(-1.0) // cout << " === " << endl; using namespace std; typedef long long ll; const int maxn = 100 + 7, INF = 0x3f3f3f3f, mod = 1e9+7; int n; int a[maxn], sum[maxn], dp[maxn][maxn], vis[maxn][maxn]; void init() { memset(sum, 0, sizeof sum); memset(dp, 0, sizeof dp); for(int i = 1; i <= n; ++i) { scanf("%d", &a[i]); sum[i] = sum[i-1] + a[i]; dp[i][i] = a[i]; } } int main() { while(scanf("%d", &n) != EOF && n) { init(); for(int len = 1; len < n; ++len) { for(int i = 1; i+len <= n; ++i) { int j = i + len; int min_ = 0; for(int k = i+1; k <= j; ++k) { min_ = min(min_, dp[i][k-1]); min_ = min(min_, dp[k][j]); } dp[i][j] = (sum[j] - sum[i-1] - min_); } } printf("%d\n", dp[1] * 2 - sum ); } return 0; }
相关文章推荐
- UVA - 10891 Game of Sum 区间DP(博弈DP)
- UVA - 10891 Game of Sum 区间DP博弈
- UVA 10891 Game of Sum(区间博弈dp)***
- UVa 10891 Game of Sum(博弈区间DP)
- UVA 10891 Game of Sum 区间dp
- Game of Sum UVA - 10891(区间dp)
- Uva 10891 Game of Sum(区间博弈dp)
- 区间dp||记忆化搜索 Game of Sum UVA - 10891 or Light OJ 1031---Easy Game(区间DP)
- uva 10891 - Game of Sum(博弈,区间dp)
- UVa 10891 Game of Sum (区间DP&博弈)
- uva10891 Game of Sum 博弈区间dp
- UVA - 10891 Game of Sum 区间DP
- UVa 10891 Game of Sum(经典博弈区间DP)
- uva_10891 - Game of Sum( 博弈区间DP )
- Uva 10891 Game of Sum - 区间DP..记忆化搜索
- UVA 10891 区间DP+博弈思想
- UVA 10891(区间dp或者极大极小博弈)
- UVA 10891 Game of Sum(区间DP)
- Uva 10891 经典博弈区间DP
- UVA 10891 Game of Sum(dp博弈)