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)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
随机推荐
- c# GDI+绘制不同字体的字符串
一段字符串中可能既有汉字又有字母,对于汉字和字母分别采用不同的字体进行绘制直接po代码了 Bitmap bmp = new Bitmap(iWidth, iHeight); Graphics g = ...
- 2016/1/14 java随机数生成
1.Math库里的static(静态)方法random() 该方法的作用是产生0到1之间(包括0,但不包括1)的一个double值. double rand = Math.random(); 2.通过 ...
- 预载入和javascript对象
请参见 http://www.west263.com/info/html/wangyezhizuo/Javascript/20080225/34168.html
- 如何抓取基于https协议的webservice数据包
方法一:基于Fiddler2等第三方工具(需要在Java端禁用SSL安全检查) 原文拷贝自http://blog.csdn.net/zmxj/article/details/6327775,向原作者表 ...
- CentOS 6.5下安装MySQL 5.6.21
Linux中使用最广泛的数据库就是MySQL,使用在线yum的方式安装的版本落后MySQL网站好几个小版本,本节亲自测试安装新版的MySQL. 测试机器环境: VMware Workstation 1 ...
- AndroidCommon示例
效果图如下: 1) 自动滚动无限循环ViewPager.ViewPager嵌套自动滚动ViewPager (2) 网络缓存Demo (3) 图片缓存Demo,图片SD卡缓存D ...
- windows 下操作目录(使用DOS命令)
Attrib 更改单个文件或目录的属性.该命令设置或删除指派给文件或目录的只读.系统.存档.隐藏以及压缩属性. 含有下列参数的 attrib 命令仅当使用故障恢复控制台时才可用.含有不同参数的 att ...
- ubuntu16.04 查看系统可用内存
free -m 查看内存情况 (单位MB) mem 行显示了从系统角度看来内存使用的情况, total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存. buffers和cach ...
- 使用IntelliJ IDEA 创建Maven项目(入门)
一. 下载Maven 下载地址:http://maven.apache.org/download.cgi tar.gz压缩格式用于unix操作系统,而zip用于windows的操作系统,但在windo ...
- VS2015 razor 提示一闪而过
出现的问题链接地址 https://social.microsoft.com/Forums/azure/zh-CN/ff308f71-c743-4f8c-b5e4-a7260c8b5f59/vs201 ...