例题28 UVa10891 Game of Sum(DP)
来源:互联网 发布:sql索引超出数组界限 编辑:程序博客网 时间:2024/06/07 12:25
题意:
看白书
要点:
因为所以人都是用尽量拿最大值,所以用d[i][j]表示剩下序列为i~j时当前取的这个人得分的最大值,因为总共得分是固定的,一个人多另一个人就少,所以结果就是2*d(1,n)-sum(1,n)。可以写出状态转移方程为:d(i,j)=sum(i,j)-min{d(i+1,j)……d(j,j),d(i,j-1)……d(i,i),0},这个式子的理解是:现在总共和为sum(i,j),先手拿走的是总和减去剩下部分的另一个能达到的最大值中的最小值。
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 100 + 10;int n;int a[N], s[N];int d[N][N],vis[N][N];int dp(int i, int j){if (vis[i][j])return d[i][j];vis[i][j] = 1;int ans = 0;for (int k = i + 1; k <= j; k++)ans = min(ans, dp(k,j));for (int k = i; k < j; k++)ans = min(ans, dp(i,k));d[i][j] = s[j] - s[i - 1] - ans;return d[i][j];}int main(){while (~scanf("%d", &n)&&n!=0){s[0] = 0;for (int i = 1; i <= n; i++){scanf("%d", &a[i]);s[i] = s[i - 1] + a[i];}memset(vis, 0, sizeof(vis));printf("%d\n", 2 * dp(1, n) - s[n]);}return 0;}还可以通过递推将复杂都降到O(n^2)
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 100 + 10;int n;int a[N], s[N];int f[N][N], g[N][N],d[N][N];int main(){while (~scanf("%d", &n)&&n!=0){s[0] = 0;for (int i = 1; i <= n; i++){scanf("%d", &a[i]);s[i] = s[i - 1] + a[i];}for (int i = 1; i <= n; i++)f[i][i] = g[i][i] = d[i][i] = a[i];for(int l=1;l<n;l++)for (int i = 1; i + l <= n; i++){int j = i + l;int m = 0;m = min(m, f[i + 1][j]);m = min(m, g[i][j - 1]);d[i][j] = s[j] - s[i - 1] - m;f[i][j] = min(d[i][j], f[i + 1][j]);g[i][j] = min(d[i][j], g[i][j - 1]);}printf("%d\n", 2 * d[1][n] - s[n]);}return 0;}
0 0
- 例题28 UVa10891 Game of Sum(DP)
- UVa10891 Game of Sum(dp)
- uva10891 Game of Sum 博弈区间dp
- UVA10891 Game of Sum(区间DP+思路)
- UVA10891 Game of Sum(区间DP)
- UVA10891- Game of Sum
- uva10891 Game of Sum
- uva10891 - Game of Sum
- uva10891 Game of Sum(博弈+区间dp+优化)
- uva10891 - Game of Sum(动归)
- UVA10891[Game of Sum] 动态规划
- 例题1.28 Sum游戏 UVa10891
- uva10891 - Game of Sum(递推,极大极小的思想)
- uva10891(sum游戏)区间dp
- UVA 10891 - Game of Sum(DP)
- UVa 10891 Game of Sum(DP)
- UVA - 10891 - Game of Sum (DP)
- 10891 - Game of Sum(DP)
- Java-Review-Note——4.多线程
- [LeetCode]15. 3Sum【&16. 3Sum Closest】
- 事件在多线程编程中的应用
- 20161011 Python 读书笔记之 列表、元祖、字典
- LeetCode 11. Container With Most Water(Two-Pointer 详解)
- 例题28 UVa10891 Game of Sum(DP)
- Java笔记 - 线程间通讯- 等待唤醒机制
- Uva 1411 ants(KM算法--二分图最佳完美匹配)
- 随机数递增排序
- C++中this指针的作用以及用法详解
- BITCS2016程序设计 | 10. 琪露诺的完美算数教室——⑨的统计I
- 入栈的Activity由于系统资源不足被被回收了怎么办
- 大白话解析模拟退火算法
- Android开发: View - 自定义