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)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
随机推荐
- js 对有“命名空间”的表单做深度解析
问题描写叙述:一个大表单中,可能包括几十个字段.这些字段在数据库中的映射非常可能不在一张表中,为了降低后台操作的工作量,我们应该在前台提交的时候对数据做初步处理. 举例说明: watermark/2/ ...
- 告诉大家我是如何在14:00秒杀到 《深入理解Bootstrap》
1.打开火狐,不用IE,3个评论窗口,层叠在一起,可以点击3次哦. 2.打开一个百度的现在时间,不能看你本机的时间,要互联网的时间. 3.等时间到13:59:59,开始依次点击按钮,总有你预想不到的结 ...
- HDU 1023 Catalan数+高精度
链接:HDU 1023 /**************************************** * author : Grant Yuan * time : 2014/10/19 15:5 ...
- HttpClient-02连接管理
2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大,这一开销对于比较小的http消息来说更大.但是如果我们直接使用已 ...
- 在vs2017中创建Node.js项目
https://github.com/Microsoft/nodejstools/wiki/Projects 1. 安装vs2017的时候,需要勾选Node.js 2.新建项目的时候,选择其他语言,然 ...
- 33. Extjs中的tree节点的操作
转自:https://blog.csdn.net/masterShaw/article/details/51354351?utm_source=blogkpcl9 ext 树节点操作 tree ...
- kernel信息及其相关命令
内核 linux内核是单内核体系设计.但充分借鉴了微内核设计体系的优点,为内核引入模块化机制 内核组成部分: kernel: 内核核心,一般为bzImage,通常在/boot 目录下,名称为vmlin ...
- mldonkey设置!看图(转载)
转自:http://www.nenew.net/ubuntu-mldonkey-application.html 这里不是争论区,amule和mldonkey各有各好,看个人爱好,没有高下,都是程序员 ...
- N - Binomial Showdown (组合数学)
Description In how many ways can you choose k elements out of n elements, not taking order into acco ...
- Linux下磁盘分区、挂载、卸载操作记录
Linux下磁盘分区.挂载.卸载操作记录. 操作环境:CentOS release 6.5 (Final) Last :: from 118.230.194.76 [root@CentOS ~]# [ ...