usaco3.3.6游戏
来源:互联网 发布:软件界面错位 编辑:程序博客网 时间:2024/06/06 00:40
一题典型的区间型dp,如果要搜索的话,我觉得做不到,可能不好搜。
讲解:
s数组储存数字。
he数组:he【i】【j】代表在i~j的总和。
用dp数组:dp【i】【j】表示第一玩家在i~j范围能拿到的最大积分(注意,不要反驳我)。
因为题目要求两个人智商都不错,所以在求dp【i】【j】时,dp【i+1】【j】表示第二玩家的最大积分了,所以转移方程如下:
dp【i】【j】=max(he【i】【j-1】-dp【i】【j-1】+s【j】,he【i+1】【j】-dp【i+1】【j】+s【i】);
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int s[120],n,dp[110][110],he[110][110];
int main()
{
//freopen("game1.in","r",stdin);
//freopen("game1.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i];
dp[i][i]=s[i];
he[i][i]=s[i];
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
he[i][j]=he[i][j-1]+s[j];
}
for(int k=1;k<n;k++)
for(int i=1;i+k<=n;i++)
dp[i][i+k]=max(he[i+1][i+k]-dp[i+1][i+k]+s[i],he[i][i+k-1]-dp[i][i+k-1]+s[i+k]);
cout<<dp[1][n]<<" "<<he[1][n]-dp[1][n]<<endl;
return 0;
}
- usaco3.3.6游戏
- 【USACO3.3.5】一个游戏
- [USACO3.3]游戏 A Game
- Cpp环境【USACO3.3.5】【CQYZOS1256】A Game 游戏
- 动规——【USACO3.3.5】A Game游戏 IOI'96
- 【USACO3.3.5】游戏(区间dp的滚动数组与编码问题)
- usaco3.4.1
- USACO3.3
- USACO3.1.6
- usaco3.2kimbits
- usaco3.3Camelot
- USACO3.3.3DP
- [USACO3.2.4 Feed Ratios]
- [模拟][usaco3.2.1]阶乘
- usaco3.1.3总分
- usaco3.1.6联系
- usaco3.1.4丑数
- usaco3.2.2阶乘
- 数据库导表
- 求模和取余的异同点
- 寄存器中 置位 与 清除 -- C
- sld()
- Heritage(高精度)
- usaco3.3.6游戏
- POJ 2386 Lake Counting(DFS)
- Training little cats
- 黑马程序员之java学习笔记9
- Linux下grep命令详解
- C语言中static,extern修饰符说明
- Quartz入门实例3-使用CronTrigger指定触发器执行job
- Mysql日志记录慢查询的SQL
- SQL Server:认识数据库