[NOIP模拟] Game
来源:互联网 发布:linux下如何退出vi 编辑:程序博客网 时间:2024/06/05 19:01
[NOIP模拟] Game
About
2017.10.29 T2
Solution :
这题与2017.10.11 T2 类似,复习此题时需要复习原T2。
我们定义 DP[i][j] 为当前还有 i 个(这里是到这来的,为什么?请自己思考),接下来会选 j 个的最坏情况的最优选取,注意是还没有选,于是我们可以得到DP的转移方程,在此之前请自己思考 :
Code:
#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <cmath>#include <ctime>#include <map>#include <vector>using namespace std;inline int read() { int i = 0, f = 1; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar(); } while(isdigit(ch)) { i = (i << 3) + (i << 1) + ch - '0'; ch = getchar(); } return i * f;}const int MAXN = 2e4 + 5;const int inf = 0x3f3f3f3f;int dp[MAXN][205], sum[MAXN], n;inline void init() { for(int i = 1; i <= n; ++i) for(int k = 0; k <= 200; ++k) dp[i][k] = -inf, sum[i] = 0;}int main() { freopen("1.in", "r", stdin); int t = read(); while(t--) { n = read(); init(); for(int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + read(); for(int i = n; i >= 1; --i) for(int k = 1; k <= 200; ++k) { if(i + k > n) { if(i <= n) dp[i][k] = 0; } else if(i + k == n) dp[i][k] = sum[n] - sum[i]; else { dp[i][k] = max(dp[i][k], -dp[i + k][k] + sum[i + k] - sum[i]); dp[i][k] = max(dp[i][k], -dp[i + k + 1][k + 1] + sum[i + k + 1] - sum[i]); } } cout<<max(-dp[1][1] + sum[1], -dp[2][2] + sum[2])<<'\n'; }}
阅读全文
0 0
- [NOIP模拟] Game
- NOIP模拟 Game 【博弈论】【动态规划】
- NOIP模拟(10.30)T2 Game
- Noip模拟
- 【NOIP模拟】20151004模拟
- 【NOIP模拟】 20151005模拟
- 【NOIP模拟】 20151006模拟
- 【NOIP模拟】 20151007模拟
- 【NOIP模拟】20151014模拟
- 【NOIP模拟】20151015模拟
- 【09 NOIP 模拟】light
- [NOIP模拟]Day1
- 8.9CH NOIP模拟
- 8.10FCH NOIP模拟
- 8.13NOIP模拟
- 8.14NOIP模拟
- noip模拟赛 双城记
- Noip模拟总结
- swift print Double
- 线程同步工具包总结
- 25_多线程
- nuxt 的异步请求方式 await axios和 axios区别
- Qt中文乱码解决思路
- [NOIP模拟] Game
- BZOJ 5071 [Lydsy 十月月赛] 排序 解题报告
- 线性表的引入及其基本操作
- js第一次学习
- Django 多对多字段的更新和插入数据
- JAVA-类修饰符
- 简单了解css
- Fiori 代码规范2---代码结构详解5
- getDeclaredFields和getFields的区别以及相似的