题意:给定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)的更多相关文章

  1. 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 ...

  2. Codeforces Gym 100015F Fighting for Triangles 状压DP

    Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...

  3. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  4. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  5. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  6. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  7. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  8. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  9. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

随机推荐

  1. 如何遍历newtonsoft.json的JObject里的JSON数据

    这种问题,在网上搜,居然没有答案,又是一堆垃圾,连谷歌上都搜不到.老实说,我喜欢这边的工作环境,可以上谷歌,毕竟是大公司,有自己的VPN .某组织整天禁这个禁那个,去年居然连谷歌都禁了,丧心病狂至此, ...

  2. sql 查询如何将结果集 输出为一段字符串?

    文件id集合 文件表. SELECT CONCAT('2323',(SELECT 'dsfsd'),'232323'); SELECT CONCAT('2323',(SELECT file_ids F ...

  3. bzoj1050

    最小生成树 其实这道题是最小生成树的变种,我们发现答案不一定在最小/最大生成树上,最短路算法也不可行,因为我们我们并不是希望最小值尽量的大,最大值尽量的小,这样不一定是最优的,那么我们枚举最小的边,然 ...

  4. C++中正确使用PRId64 (转载)

    转自:http://blog.csdn.net/win_lin/article/details/7912693 例子参考高性能流媒体服务器SRS:https://github.com/winlinvi ...

  5. CodeIgnitor 配置类的使用

    CI 的配置文件统一放在 application/config/ 目录下面,框架有一个默认的主配置文件 application/config/config.php.其部分内容如下: <?php ...

  6. cookie使用详解

    cookie是用来保存客户资料的好方法,与同样可以用来保存客户资料的 session不同的是,session是把资料保存在服务器端,而cookie是把资料保存在客户端,我们平常接触的最多的cookie ...

  7. iOS静态库.Framework制作

    首先要解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库: 某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式 ...

  8. ACM_排序

    除了sort,你还会什么 Time Limit: 1000/500ms (Java/Others) Problem Description: 给出若干人的年龄(1~100之间的整数),把它们按照从小到 ...

  9. ASP.NET MVC应用程序中支持用户使用腾讯QQ和微信以及新浪微博的第三方登录

    什么是第三方授权登录,就是一些大家都会有的帐号如QQ.微信.淘宝.微博等账户.通过那些巨头公司提供的api直接实现登录. 当然,我们是不可能得到你的用户名和密码的.不了解的人,可能会存在这个疑虑.我们 ...

  10. C# 自动批量导入图片到数据库中

    using Model; using System; using System.Collections.Generic; using System.Data; using System.Data.Sq ...