题意:给定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. 解决burp suite 使用chrome訪问https失真的问题

    用burp suite 訪问https网页 尤其使用chrome(有时候firefox也会) 会出现js或者css载入不出来的情况 这样的时候,导出burp suite的证书,保存为cer格式 然后进 ...

  2. 在.Net MVC结构API接口中推断http头信息实现公共的权限验证过滤器演示样例

    //control   action public class TestController : ApiController { [MyAuthFilter] public string test(s ...

  3. ZOJ 3876 May Day Holiday 蔡勒公式

                                                   H - May Day Holiday Description As a university advoc ...

  4. Google's Hybrid Approach to Research

    文档地址:戳我 总结: (i) aims to generate scientific and engineering advances in fields of import to Google, ...

  5. java Bean及其使用

    1 getter/setter方法 java例子: public class student { private String name; public String getName() { retu ...

  6. ZOJ 3609 Modular Inverse(扩展欧几里德)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4712 The modular modular multiplicat ...

  7. Android 通过USB查看kernel调试信息【转】

    本文转载自:http://blog.csdn.net/lindonghai/article/details/51683644 前提:电脑已安装adb并可正常使用. 在调试Android驱动时,需要查看 ...

  8. ModuleNotFoundError: No module named 'urlparse'

    这是2.x转3.x问题 2.x写法: from urlparse import urlparse   3.x写法: from urllib.parse import urlparse 问题解决.

  9. 30. extjs getEl方法 怎么用

    转自:https://blog.csdn.net/evilcry2012/article/details/50586861 2014-10-27 11:57 提问者采纳   getEl = compo ...

  10. Eclipse使用Tomcat发布项目时出现YadisException异常解决方案

    调整使用Eclipse的JDK版本,大概JDK版本过低会出现这个org.openid4java.discovery.yadis.YadisException: 0x704: I/O transport ...