Tyvj P3276
题目链接:http://www.tyvj.cn/p/3276
这题是一个动归题,一直没有想出动归的做法,后来求教别人之后写了一个记忆化搜索,只有出题者又给我提供了DP的解法,下面我来写写DP的写法
设置数组dp[i][j],表示从位置j开始,后面i个数的最大值
去掉最右端的数:dp[i][j]=sum[i+j-2]-sum[j-1]-dp[i-1][j]+a[i+j-1]
去掉最左端的数:dp[i][j]=sum[i+j-1]-sum[j]-dp[i-1][j+1]+a[j]
(具体参看笔记)
然后再取左边和右边的最大值即可,很好的题目,确实值得一做
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=+;
int a[maxn],sum[maxn];
int dp[maxn][maxn];
int main()
{
int n;
while(cin>>n)
{
memset(dp,,sizeof(dp));
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++)
{
cin>>a[i];
sum[i]=sum[i-]+a[i];
}
for(int i=;i<=n;i++)
dp[][i]=a[i];
for(int i=;i<=n;i++)
for(int j=;j<=n-i+;j++)
{
dp[i][j]=sum[i+j-]-sum[j-]-dp[i-][j]+a[i+j-]; //去掉最右端的数
if(dp[i][j]<sum[i+j-]-sum[j]-dp[i-][j+]+a[j])
dp[i][j]=sum[i+j-]-sum[j]-dp[i-][j+]+a[j]; //去掉最左端的数
}
cout<<dp[n][]<<" "<<sum[n]-dp[n][]<<endl;
}
return ;
}
同时,我也把别人写的记忆化搜索的代码贴上去
#include <stack>
#include <cstdio>
#include <list>
#include <cassert>
#include <set>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <string>
#include <map>
#include <cmath>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define SZ(x) (int)x.size()
#define Lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
#define MS(arr, num) memset(arr, num, sizeof(arr))
#define PB push_back
#define X first
#define Y second
#define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1))
#define LC rt << 1, l, mid
#define RC rt << 1|1, mid + 1, r
#define LRT rt << 1
#define RRT rt << 1|1
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 5e4+;
const int MOD = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
int cases = ;
typedef pair<int, int> pii; int arr[], sum[];
map<pii, int> mp; int Query(int l, int r)
{
if (mp.count(MP(l, r))) return mp[MP(l, r)];
if (l == r) return arr[l];
int ans;
ans = max(arr[l] + sum[r]-sum[l]-Query(l+, r), arr[r] + sum[r-]-sum[l-]-Query(l, r-));
mp[MP(l, r)] = ans;
return ans;
} int main()
{
//ROP;
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
scanf("%d", &arr[i]);
sum[i] = arr[i];
sum[i] += sum[i-];
}
int ans = Query(, n);
printf("%d %d\n", ans, sum[n]-ans);
return ;
} Download as text
感悟就是我太弱了,已经不能忍,接下来无论是考研,还是创新项目,抑或是刷题,都必须好好努力了
Tyvj P3276的更多相关文章
- [BZOJ3223]Tyvj 1729 文艺平衡树
[BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
- TYVJ P1080 N皇后
描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 列号 1 2 3 4 5 6 -- ...
- TYVJ博弈论
一些比较水的博弈论...(为什么都没有用到那什么SG呢....) TYVJ 1140 飘飘乎居士拯救MM 题解: 歌德巴赫猜想 #include <cmath> #include < ...
- [TYVJ]1519 博彩
传送门 AC自动机模板题,好吧我只是单纯的搞个AC自动机的模板. //TYVJ 1519 //by Cydiater //2016.10.18 #include <iostream> #i ...
- NOIP 2005 等价表达式 (TYVJ P1060)
做题记录: 2016-08-10 23:35:09 背景 NOIP2005 提高组 第四道 描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代 ...
随机推荐
- 最小点集覆盖=最大匹配<二分图>/证明
来源 最小点集覆盖==最大匹配. 首先,最小点集覆盖一定>=最大匹配,因为假设最大匹配为n,那么我们就得到了n条互不相邻的边,光覆盖这些边就要用到n个点. 现在我们来思考为什么最小点击覆盖一定& ...
- 关于前台主键输入错误对后台hibernate方法的影响
由于前台输入时开始不小心打错了主键为value=“${conf_id}”/ 导致后台得到的主键不是数字“1”而是“1/”所以到后台就算是进的updata方法结果运行的却是添加方法 原因可能是传入的对象 ...
- 介绍两个Android不常用的Drawable:GradientDrawable和 StateListDrawable
//-------------------------------------------------------------------------------------------------- ...
- Jdk1.7环境变量的配置
在"系统属性——高级——环境变量——系统变量"中新建如下变量: 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0_03 (即jdk ...
- Lucene中的合并因子mergeFactor
mergeFactor 是用来决定segment该如何被addDocument()方法进行合并的. 当mergeFactor取比较小的值时,索引时所使用的内存较少 而且搜素未优化的速度会比较快.因此, ...
- android 垂直 SeekBar 源代码(VerticalSeekBar)[转]
主要是继承 AbsSeekBar 然后修改下面这些方法 onProgressRefresh() //当进度条数据更新的时候,例如我们拖动滑动条的时候,这个方法被调用 setThumbPos() //这 ...
- DHCP详细工作过程(转)
DHCP客户端通过和DHCP服务器的交互通讯以获得IP地址租约.为了从DHCP服务器获得一个IP地址,在标准情况下DHCP客户端和DHCP服务器之间会进行四次通讯.DHCP协议通讯使用端口UDP 67 ...
- jq模拟操作
1.常用模拟 trigger() $('#btn').trigger('click'); 当页面加载完,点击事件就会完成 上面也可以简写成:$('#btn').click(); 2.触发自定义事件 t ...
- docker入门实战笔记
1.什么是docker: docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致 ...
- UIImageView动画
NSMutableArray *arrM = [NSMutableArray array]; // 2.加载所有图片 ; i <= ; i++) { NSString *imageName = ...