UVA
来源:互联网 发布:淘宝游戏光盘 编辑:程序博客网 时间:2024/06/10 13:58
用 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 = 10000 + 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(vis, 0, sizeof vis); for(int i = 1; i <= n; ++i) { scanf("%d", &a[i]); sum[i] = sum[i-1] + a[i]; }}int d(int l, int r) { // 区间 l - r 之间某个人能取的最大值 if(vis[l][r]) return dp[l][r]; vis[l][r] = 1; int min_ = 0; //记录从左右两边开始的子区间的最小值(负的),那么这个区间的最大值就是区间和减去这个最小值;如果是正的,那么整个区间的和就是这个区间的最大值 for(int i = l; i < r; ++i) min_ = min(min_, d(l, i)); for(int i = l+1; i <= r; ++i) min_ = min(min_, d(i, r)); return dp[l][r] = (sum[r] - sum[l-1] - min_ );}int main() { while(scanf("%d", &n) != EOF && n) { init(); printf("%d\n", d(1, n) * 2 - sum[n]); } return 0;}
阅读全文
1 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- 180度vr直播用,鱼眼视频展开到全景
- SQLite3性能深入分析
- leetcode --19. Remove Nth Node From End of List
- linux 修改文件权限
- 计算机网络
- UVA
- 2017/8/11 离线赛
- Hibernate与JPA
- Spring学习笔记—基础知识
- Linux 小记
- 数据结构实验之排序六:希尔排序
- LA4329 Ping pong(树状数组)
- javaScript内置对象Date
- Android数据库高手秘籍(二)——创建表和LitePal的基本用法