gym101343J. Husam and the Broken Present 2 (状压DP)
题意:给定n个串 每个串长度不超过100
找到一个新串 使得这n个串都是它的字串 输出这个新串的最小长度
题解:n是15 n的阶乘的复杂度肯定不行 就想到了2的15次方的复杂度
想到了状压但是不知道怎么维护 所以加一维就好了 dp[i][j]表示当前状态为i 且末尾是第j个串
转移简直弱智 预处理val[i][j]表示第i个串和第j个串拼在一起会节省的长度 那么答案最后就是总长度减去节省最大的长度了
然后还要注意一下包含的问题 假如1 2 3,2 3 4 5和3 4这三个串3 4是被包含的
但是你转移的时候1 2 3和2 3 4 5接在一起后变成 1 2 3 4 5包含了3 4但是此时的状态还是只用了第1个和第2个串的状态
所以把包含的串去重一下就好了... 弱智这都写了四个小时
#include <bits/stdc++.h>
using namespace std; int vis[];
int num[];
int q[][];
int val[][];
int dp[][]; int main()
{
int n;
scanf("%d", &n); int ans = ;
for(int i = ; i <= n; i++)
{
scanf("%d", &q[i][]);
for(int j = ; j <= q[i][]; j++) scanf("%d", &q[i][j]);
}
for(int i = ; i <= n; i++) vis[i] = ; int cnt = ;
for(int i = ; i <= n; i++) //去重
{
if(!vis[i]) continue;
for(int j = ; j <= n; j++)
{
if(i == j) continue;
if(!vis[j]) continue; if(q[i][] >= q[j][])
{
for(int k = ; k + q[j][] - <= q[i][]; k++)
{
bool f = true;
for(int kk = ; kk <= q[j][]; kk++)
{
if(q[i][k + kk - ] == q[j][kk]) continue;
else {f = false; break;}
}
if(f) {vis[j] = ; break;}
}
}
}
} for(int i = ; i <= n; i++) if(vis[i]) cnt++; int zn = ;
for(int i = ; i <= n; i++) if(vis[i]) num[++zn] = i; for(int i = ; i <= zn; i++)
{
for(int j = ; j <= q[num[i]][]; j++) q[i][j] = q[num[i]][j];
ans += q[i][];
} for(int i = ; i <= cnt; i++) //预处理价值
{
for(int j = ; j <= cnt; j++)
{
if(i == j) continue;
val[i][j] = ;
for(int k = ; k <= q[i][]; k++)
{
if(q[i][k] == q[j][])
{
bool f = true;
for(int kk = ; kk + k <= q[i][]; kk++)
{
if(q[i][k + kk] == q[j][kk + ]) continue;
else { f = false; break;}
}
if(f) {val[i][j] = q[i][] - k + ; break;}
}
}
}
}
memset(dp, , sizeof(dp)); int sta = ( << cnt) - ;
for(int i = ; i <= sta; i++)
{
memset(vis, , sizeof(vis));
for(int j = ; j < n; j++)
{
int c = (i >> j) & ;
if(c == ) vis[j + ] = ;
} for(int j = ; j <= n; j++)
{
if(vis[j]) continue;
int v = ( << (j - )); for(int k = ; k <= n; k++)
{
if(!vis[k]) continue;
dp[i + v][j] = max(dp[i + v][j], dp[i][k] + val[k][j]);
}
}
} int zd = ;
for(int i = ; i <= cnt; i++) zd = max(zd, dp[sta][i]);
printf("%d\n", ans - zd);
return ;
} /*
3
3 1 2 3
2 3 4
4 2 3 4 5
*/
gym101343J. Husam and the Broken Present 2 (状压DP)的更多相关文章
- Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】
2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
随机推荐
- HTTPie: a CLI, cURL-like tool for humans
HTTPie github HTTPie 是用 Python 编写,用到了 Requests 和 Pygments 这些出色的库. 主要特性: 直观的语法 格式化和色彩化的终端输出 内置 JSON 支 ...
- HDU 5773The All-purpose Zero
The All-purpose Zero Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- java jmenu的替代方案
本来想实现一个类似jmenu的窗口,但是发现找了半天也没从L&F中找到实现menu的消失的头绪,最后还是使用了替代方案 使用JDialog来模拟一个menu的窗口,设置 setModel(fa ...
- 在ARM-linux上实现4G模块PPP拨号上网【转】
本文转载自:http://blog.csdn.net/zqixiao_09/article/details/52540887 在ARM平台上实现4G模块的PPP拨号上网,参考网上的资料和自己的理解,从 ...
- openstack dnsmasq
killall dnsmasq systemctl restart openstack-nova-compute /sbin/dnsmasq --conf-file=/var/lib/libvirt/ ...
- Vue.js 项目接口管理
在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢? 本文使用vue-cli生成的项目举例. 第一步.在src目录下新建一个文件夹http,在http目录下建 ...
- java笔记线程方式1优先级
* 我们的线程没有设置优先级,肯定有默认优先级. * 那么,默认优先级是多少呢? * 如何获取线程对象的优先级? * public final int getPriority():返回线程对象的优 ...
- SVN报错 Not Found In Revision 不支持空目录
如果你要初始化上传的SVN目录为空,有可能会报这个错误 解决方法:在SVN下新建一个目录即可
- Python基础 — Pandas
Pandas -- 简介 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. Pandas ...
- bzoj 1653: [Usaco2006 Feb]Backward Digit Sums【dfs】
每个ai在最后sum中的值是本身值乘上组合数,按这个dfs一下即可 #include<iostream> #include<cstdio> using namespace st ...