4.3 省选模拟赛 序列游戏 dp


可以发现 某一段被删除后状态难以表示 也难以链接起来。
考虑暴力 有40分的状压dp 暴力存状态 然后枚举转移即可。最后注意和f[0]这个状态取max 不然一分都没有。
const int MAXN=12;
int f[1<<MAXN];
int a[MAXN],b[MAXN],v[MAXN],w[MAXN];
int n,maxx,ans;
int main()
{
freopen("1.in","r",stdin);
//freopen("sequence.out","w",stdout);
get(n);
if(n<=10)
{
memset(f,0xcf,sizeof(f));
rep(1,n,i)get(v[i]);
rep(1,n,i)get(a[i]);
maxx=(1<<n)-1;
f[maxx]=0;
fep(maxx,1,i)
{
if(f[i]<-INF)continue;
int top=0;
rep(1,n,j)if((i&(1<<(j-1))))b[++top]=a[j],w[top]=(1<<(j-1));
rep(1,top,j)
{
rep(1,top-j+1,k)
{
int en=k+j-1;
int flag=0,s=i;
rep(k,en,l)
{
if(l>k)
{
if(abs(b[l]-b[l-1])!=1){flag=1;break;}
if(l<en)if(b[l]<b[l-1]&&b[l]<b[l+1]){flag=1;break;}
}
s=s^w[l];
}
if(!flag)f[s]=max(f[s],f[i]+v[j]);
}
}
ans=max(ans,f[i]);
}
ans=max(ans,f[0]);
put(ans);return 0;
}
}
从上面的分析我们也可以发现难点就在于状态的表示。
正解:int f[N][N][N],g[N][N][N],last[N][N];//f[i][j][k]表示对于区间[i,j] j一定和后面的K个连成一段进行删除的最大值.
//f数组表示可能存在单个高峰 g数组和f组一样 g数组表示没有峰为单调序列。形状定义为[i,j-1]形成的形状
很遗憾不明白为什么要这样做 也看不懂这样的转移是再干嘛。
留下STD 以后填坑。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
const int N = 153, INF = -0x3f3f3f3f;
int n, m, ans[N], v[N], a[N], last[N][N], f[N][N][N], g[N][N][N];
map<int, int> hash;
inline void upt(int &x, const int &y) {
if (x < y) x = y;
}
char ch;
inline int read() {
int res = 0, sgn = 0;
while (ch = getchar(), ch < '0' || ch > '9') if (ch == '-') break;
ch == '-' ? sgn = 1 : res = ch - 48;
while (ch = getchar(), ch >= '0' && ch <= '9') res = res * 10 + ch - 48;
return sgn == 0 ? res : -res;
}
int main() {
freopen("1.in", "r", stdin);
// freopen("sequence.out", "w", stdout);
n = read();
for (int i = 1; i <= n; ++i) v[i] = read();
for (int i = 1; i <= n; ++i) {
a[i] = read();
if (hash[a[i]] == 0) hash[a[i]] = ++m;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) last[i][j] = last[i - 1][j];
last[i][hash[a[i]]] = i;
}
memset(f, INF, sizeof(f));
memset(g, INF, sizeof(g));
//cout<<f[0][0][0]<<' '<<INF<<endl;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= n; ++j)
if (i + j <= n)
f[i][i][j] = g[i][i][j] = v[j + 1];
else break;
f[i][i - 1][0] = g[i][i - 1][0] = 0;
}
for (int l = 1; l <= n; ++l)
for (int i = 1; i <= n; ++i) {
int j = i + l;
if (j > n) break;
for (int k = 0; k <= n; ++k) {
if (j + k > n) break;
upt(f[i][j][k], f[i][j - 1][0] + v[k + 1]);
upt(g[i][j][k], f[i][j - 1][0] + v[k + 1]);
int p = hash[a[j] + 1], q = hash[a[j] - 1];
for (int h = last[j][p]; h >= i; h = last[h - 1][p])
upt(f[i][j][k], f[i][h][k + 1] + f[h + 1][j - 1][0]);
for (int h = last[j][q]; h >= i; h = last[h - 1][q]) {
upt(f[i][j][k], g[i][h][k + 1] + f[h + 1][j - 1][0]);
upt(g[i][j][k], g[i][h][k + 1] + f[h + 1][j - 1][0]);
}
}
}
ans[0] = 0;
for (int i = 1; i <= n; ++i) {
upt(ans[i], ans[i - 1]);
for (int j = 0; j < i; ++j)
upt(ans[i], ans[j] + f[j + 1][i][0]);
}
printf("%d\n", ans[n]);
return 0;
}
4.3 省选模拟赛 序列游戏 dp的更多相关文章
- 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点
容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...
- 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const in ...
- 5.10 省选模拟赛 拍卖 博弈 dp
LINK:拍卖 比赛的时候 前面时间浪费的有点多 写这道题的时候 没剩多少时间了. 随便设了一个状态 就开始做了. 果然需要认真的思考.其实 从我的状态的状态转移中可以看出所有的结论. 这里 就不再赘 ...
- 5.12 省选模拟赛 T2 贪心 dp 搜索 差分
LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...
- 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
LINK:Decompose 看起来很难 实际上也很难 考验选手的dp 树链剖分 矩阵乘法的能力. 容易列出dp方程 暴力dp 期望得分28. 对于链的情况 容易发现dp方程可以转矩阵乘法 然后利用线 ...
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- [10.18模拟赛] 序列 (DP)
[10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...
随机推荐
- 网页开发中利用CSS以图换字的多中实现方法总汇
在h1标签中,新增span标签来保存标题内容,然后将其样式设置为display:none <style> h1 { width: 64px; height: 64px; backgroun ...
- SEO:前端优化网站,提高排名
最近优化网站排名,记录一下过程及注意的东西. 1.查询方法 百度:site:+网站名 例如:site:realtour.cn360: 直接输入网址:www.realtour.cn 2.网站优化方式 ...
- django 缓存(memcached)
Django提供了6种缓存方式 开发调试缓存 内存缓存 文件缓存 数据库缓存 Memcache缓存(使用python-memcached模块) Memcache缓存(使用pylibmc模块) 常使用的 ...
- abp一代数据迁解析
abp版本5.9 概述 数据迁移无非就是两件事情,1.创建数据库,并根据实体创建对应的表:2.添加一些初始数据 abp的数据迁移也是完成这两件事,比较特殊的是它是多租户saas系统,而且支持不同的租户 ...
- Windows 最值得推荐的装机必备“神器”软件大合集
工欲善其事,必先利其器.每个人在平时使用电脑的过程中,多多少少都会积累一些好用的软件,我也不例外,从业这么多年,收藏了许多不错的软件,通过这篇文章都分享给大家.如果觉得不错,请把这篇文章分享给你的小伙 ...
- python爬虫学习01--电子书爬取
python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...
- MySQL数据库使用报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
今天MySQL数据库,在使用的过程中一直报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement be ...
- 3dTiles 数据规范详解[4.2] i3dm瓦片二进制数据文件结构
i3dm,即 Instanced 3D Model,实例三维模型的意思. 诸如树木.路灯.路边的垃圾桶.长椅等具有明显 重复 特征的数据.这类数据用得较少(笑,现在都喜欢搞BIM.倾斜摄影.精模.白模 ...
- MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)
写在之前:不建议那种上来就是各种面试题罗列,然后背书式的去记忆,对技术的提升帮助很小,对正经面试也没什么帮助,有点东西的面试官深挖下就懵逼了. 个人建议把面试题看作是费曼学习法中的回顾.简化的环节,准 ...
- EF中延迟加载的那些事
延迟加载又称懒加载,通俗一点就是关联了一个对象,不用的时候不去查这个对象,当调用的时候再组织sql去查出这个对象的相关内容. 一.在使用EF时,我们会发现借助于框架生成的实体类中的的导航属性通常是标记 ...