HDU 6199 DP
来源:互联网 发布:淘宝创建店铺流程 编辑:程序博客网 时间:2024/06/05 21:02
简略题意:
Alice wants to maximize the difference while Bob wants to minimize it.
被题意杀了...怎么看都是A想最大化差值,B想最小化差值吧。
那正确理解题意之后就可以解题啦。
用
转移也很简单。
此时我们发现我们只知道初始状态是什么,而末状态不定,因此需要逆推。
复杂度如何计算呢,考虑最坏情况,每次都取比上一次多的个数。
因此时间复杂度和空间复杂度都为
可以发现我们每次转移只需要用到不超过
#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 22000;const int mod = 210;int t;int n;int sum[maxn];int dp[mod][mod][2];int val[maxn];void umax(int &x, int y) { if(x < y) x = y;}void umin(int &x, int y) { if(x > y) x = y;}int main() { scanf("%d", &t); while(t--) { scanf("%d", &n); sum[0] = 0; for(int i = 1; i <= n; i++) scanf("%d", &val[i]), sum[i] = sum[i-1] + val[i]; memset(dp, 0, sizeof dp); int limit = sqrt(2*n); for(int i = n; i >= 0; i--) { for(int j = 0; j <= limit; j++) { for(int k = 0; k < 2; k++) { int v1 = sum[i+j] - sum[i]; int v2 = sum[i+j+1] - sum[i]; int p1 = i % mod, p2 = (i+j)%mod, p3 = (i+j+1)%mod; if(k == 0) { if(i + j <= n) dp[p1][j][k] = dp[p2][j][k^1] + v1; if(i + j + 1 <= n) umax(dp[p1][j][k], dp[p3][j+1][k^1] + v2); } else { if(i + j <= n) dp[p1][j][k] = dp[p2][j][k^1] - v1; if(i + j + 1 <= n) umin(dp[p1][j][k], dp[p3][j+1][k^1] - v2); } } } } cout<<dp[0][1][0]<<endl; } return 0;}
阅读全文
0 0
- HDU 6199 DP
- HDU 6199 dp
- hdu 6199 dp
- HDU DP
- DP? HDU
- DP? HDU
- DP? HDU
- 【dp】HDU
- 【dp】HDU
- 【dp】 HDU
- DP? HDU
- HDU 6199 gems gems gems [DP+DP优化]
- HDU 6199 gems gems gems dp
- hdu 6199 gems gems gems dp
- hdu 6199 gems gems gems(DP)
- HDU 1003 && HDU 1231 DP
- hdu 1058 DP
- HDU 1069 dp
- PHP实现多图上传预览~(仿微信)
- 酷划锁屏手机赚钱APP的使用经验分享
- SYBASE 常用 sp_configure
- dfs走迷宫
- Android通讯录、城市选择器列表的实现
- HDU 6199 DP
- Centos7 ffmpeg
- 将hdfs上的数据通过MapReduce上传到hbase上
- Android开发FrameLayout动态添加控件位置问题
- monkey.patch_all()处理多线程问题
- Java5
- 方阵
- 数据链路层的三个基本问题
- bzoj 1674: [Usaco2005]Part Acquisition(最短路)