SP5271 XOINC - A Coin Game

双倍经验:P2964 [USACO09NOV]硬币的游戏A Coin Game

O3做法(TLE):枚举i,j,k,即剩下i枚金币,上一轮选了j枚金币,这一轮选k(1<=k<=j * 2)枚金币。

O2做法 1:容易发现,对于【j-1】,k枚举范围为1~2j-2;对于【j】,k的范围只增加了2j-1,2j两项,可以枚举i,j,再由【j-1】的状态继续判断2j-1,2j两项(sum为前缀和)

#include<bits/stdc++.h>
using namespace std;
int n,sum[2001],c[2001],dp[2001][2001];
int main()
{
cin>>n;
for(int i=n;i>=1;i--)cin>>c[i];//为了处理方便,我们直接逆序输入(编号自底向上)
for(int i=1;i<=n;i++)sum[i]+=sum[i-1]+c[i];//获取前缀和
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
dp[i][j]=dp[i][j-1];//重合部分
int k=2*j-1;
if(k<=i)dp[i][j]=max(dp[i][j],sum[i]-dp[i-k][k]);//新增状态
k+=1;
if(k<=i)dp[i][j]=max(dp[i][j],sum[i]-dp[i-k][k]);//新增状态
}
cout<<dp[n][1]<<endl;
return 0;
}

O2做法 2:剩下第i枚金币,本次最多在其中取j个,要么由最多取j-1枚的状态转移,要么取j个,则下一轮最多取min(i-j,j<<1)枚

#include<cstdio>
#include<iostream>
using namespace std;
int n,s[2001],f[2001][2001];
int main() {
scanf("%d",&n);
for (int i=n; i; i--) scanf("%d",&s[i]);//倒序输入
for (int i=2; i<=n; i++) s[i]+=s[i-1];
for (int i=1; i<=n; i++)
for (int j=1; j<=i; j++)//本次取的个数不超过剩下的个数
f[i][j]=max(f[i][j-1],s[i]-f[i-j][min(i-j,j<<1)]);
printf("%d",f[n][2]);
}

最新文章

  1. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.2
  2. Hihocoder 太阁最新面经算法竞赛18
  3. Docker容器操作中常用命令集合
  4. Ubuntu16.04安装docker
  5. SQLServer2012在登录远程服务器实例时报错:尝试读取或写入受保护的内存
  6. Vue基础----&gt;VueJS的使用(一)
  7. struts.xml什么时候加载
  8. System.Runtime.InteropServices.COMException (0x800706BA) 解决方法
  9. bottle-session 0.3 : Python Package Index
  10. 采用Jenkins搭建持续集成环境
  11. Android服务
  12. JAVA String 工具类
  13. Windows内置安全主体
  14. jcp 打印机字体变淡变模糊bootstrap
  15. Apache Kylin学习资料
  16. HBase Snapshot原理和实现
  17. c#中枚举类型的定义与使用
  18. j.u.c系列(09)---之并发工具类:CyclicBarrier
  19. 免费 web api 接口大全
  20. 在ChemDraw中一键隐藏所有氢原子的方法

热门文章

  1. 最短路-B - 六度分离
  2. POJ1273【网络流】
  3. 微信小程序配置合法域名和业务域名
  4. Python之路Day09
  5. [Arc068D/At2299] Card Eater - 结论
  6. C++中局部变量的返回
  7. flaskapp
  8. Servlet与idea
  9. Docker的安装和操作(虚拟机+linux系统)
  10. sql简单练习语句