2017 JUST Programming Contest 2.0

题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2

J. Husam and the Broken Present 2
time limit per test:1.0 s
memory limit per test:256 MB
input:standard input
output:standard output

After you helped Husam and rebuilt his beautiful array a he became very happy. To avoid losing his array again, Husam made n copies from it, and distributed it to n of his friends. After that Husam became sure that he can rebuild the array a again if he lost it, so he destroyed the table t.

Today, Husam was looking for his array a, but he was not able to find it. Husam visited all his n friends to take a copy from the array. Unfortunately, all his friends thought that the length of the array a was very long, so instead of keeping the array itself, each friend i take a subarray (li, ri) from the array and kept it in a safe place, and get rid of the rest of the array.

Now Husam has n subarrays from the array a, but he cannot remember the original array or even its length. Husam now needs your help again, he will give you the n subarrays, and your task is to build a new array a such that it contains all the given subarrays inside it as subarrays, and its length must be as minimal as possible. Can you?

Input

The first line contains an integer n (1 ≤ n ≤ 15), where n is the number of friends Husam has.

Then n lines follow, each line i begins with an integer mi (1 ≤ mi ≤ 100), where mi is the length of the subarray the ith friend has. Then mi integers follow, representing the ith subarray. All values x in the subarrays are in the range (1 ≤ x ≤ 109).

Output

Print the minimal length of the new array a, such that a contains all the given subarrays in the input inside it as subarrays.

Examples
Input
3
2 1 2
4 3 4 5 6
3 2 3 4
Output
6
Input
5
3 4 7 5
4 7 9 2 5
3 7 5 2
4 5 1 4 7
4 9 2 5 1
Output
9
Note

A subarray of the array a is a sequence al, al + 1, ..., ar for some integers (l, r) such that (1 ≤ l ≤ r ≤ n).

In the first test case the array a can be [1, 2, 3, 4, 5, 6]. Its length is as minimal as possible, and it contains all the the given subarrays in the input inside it as subarrays.

题意:构造一个序列包含所给的N个子序列(N≤15),求构造序列的最短长度。

题解:

考虑状态压缩,有2^N种状态,设dp[i][j]表示状态为i,以第j个子序列结尾的最小长度;

状态转移:从以第j个子序列结尾的状态转移到以第k个子序列的状态:

  dp[i|(1<<(k-1))][k]=min{dp[i][j]+a[k][0]-num[j][k]}   (其中,a[k][0]表示第k个子序列的长度,num[j][k]表示第j个子序列的后缀与第k个子序列的前缀重合部分的长度)

注意:先将被其他子序列包含的子序列删去......

【感觉自己现在一敲题就各种手残情况......】

代码:

 #include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int a[][];
bool vis[]; //vis[i]:第i个串是否被其他串包含
int num[][];
int dp[(<<)][];//dp[i][j]:状态为i,以第j个子序列结尾的最小长度
int main() {
int n, i, j, k, o, sum = , t, ans = 1e9;
scanf("%d", &n);
for(i = ; i <= n; ++i) {
scanf("%d", &a[i][]);
for(j = ; j <= a[i][]; ++j) scanf("%d", &a[i][j]);
}
for(i = ; i <= n; ++i) if(!vis[i]){//删去被其他子序列包含的子序列
for(j = ; j <= n; ++j) {
if(vis[j] || i == j || a[j][] > a[i][]) continue; for(k = ; k <= a[i][]-a[j][]+; ++k) {
for(o = ; o <= a[j][]; ++o)
if(a[i][k+o-] != a[j][o]) break;
if(o == a[j][]+) {vis[j] = true; break;}
}
}
}
for(i = ; i <= n; ++i) if(!vis[i]) {
for(sum++,j=; j<=a[i][]; ++j) a[sum][j] = a[i][j];
}
n = sum;
for(i = ; i <= n; ++i) {//计算num[i][j]
for(j = ; j <= n; ++j) {
if(i == j) continue;
for(k = ; k <= a[i][]; ++k) {//枚举重合长度
for(t=, o=a[i][]-k+; o <= a[i][]; ++o)
if(a[i][o] != a[j][t++]) break;
if(o == a[i][]+) num[i][j] = k;
}
}
}
sum = (<<n)-; //状态总数
memset(dp, inf, sizeof(dp));
for(i = ; i <= n; ++i) dp[<<(i-)][i] = a[i][];
for(i = ; i <= sum; ++i) {//计算dp[i][j]
for(j = ; j <= n; ++j) {
if(!((<<(j-))&i)) continue;
for(k = ; k <= n; ++k) {
if((<<(k-))&i) continue;
dp[i|(<<(k-))][k]=min(dp[i|(<<(k-))][k],dp[i][j]+a[k][]-num[j][k]);
}
}
}
for(i = ; i <= n; ++i) ans = min(ans, dp[sum][i]);
printf("%d\n", ans);
return ;
}

31ms

Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】的更多相关文章

  1. gym101343J. Husam and the Broken Present 2 (状压DP)

    题意:给定n个串 每个串长度不超过100 找到一个新串 使得这n个串都是它的字串 输出这个新串的最小长度 题解:n是15 n的阶乘的复杂度肯定不行 就想到了2的15次方的复杂度 想到了状压但是不知道怎 ...

  2. Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)

    http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...

  3. Codeforces Gym 191033 E. Explosion Exploit (记忆化搜索+状压)

    E. Explosion Exploit time limit per test 2.0 s memory limit per test 256 MB input standard input out ...

  4. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

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

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

  6. Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP

    Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...

  7. codeforces Diagrams & Tableaux1 (状压DP)

    http://codeforces.com/gym/100405 D题 题在pdf里 codeforces.com/gym/100405/attachments/download/2331/20132 ...

  8. 状压dp Gym - 100676G

    http://codeforces.com/gym/100676 题目大意: 给你n个科目,m个关系,例如A->B,表示要学习B科目,一定要把A科目学习掉.同理,如果还有C->B,那么,B ...

  9. 状压dp Codeforces Beta Round #8 C

    http://codeforces.com/contest/8/problem/C 题目大意:给你一个坐标系,给你一个人的目前的坐标(该坐标也是垃圾桶的坐标),再给你n个垃圾的坐标,这个人要捡完所有的 ...

随机推荐

  1. Windows2012开机启动项设置

    最简单方式 开始->运行->输入shell:startup 在打开的启动文件夹中,将需要启动程序的快捷方式复制进去,完工 重启试试吧 https://blog.csdn.net/tmton ...

  2. Javascript一个在页面内追加元素的小例子

    如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...

  3. 用bind方法保持this上下文

    什么是this对象 先来说说什么是this对象吧.每一个函数在调用的时候都会自己主动获取两个特殊变量:this和arguments对象. this值详细是指哪个对象是和该函数的运行环境相关的.假设是作 ...

  4. 控制器pop时没有被销毁(没有走dealloc方法)错误原因

    ARC环境下,不需要我们进行过多的内存的管理我们需要做的就是在dealloc方法中进行内存管理,但是错误的代码也会造成内存管理方法dealloc不执行,错误的原因无非以下三种,其中第二种和第三种最容易 ...

  5. MySQL4:索引

    什么是索引 索引是对数据库表中一列或者多列的值进行排序的一种结构,所引用于快速找出在某个 列中有一特定值的行.不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行.表越大,查询数据所 ...

  6. UNIX高手应该保持的习惯

    UNIX 高手的 10 个习惯 克服不良的 UNIX 使用模式 采用 10 个能够提高您的 UNIX® 命令行效率的好习惯——并在此过程中摆脱不良的使用模式.本文循序渐进地指导您学习几项用于命令行操作 ...

  7. Messenger与AIDL的异同

    Messenger与AIDL的异同 最近做项目需要使用进程间通信,大家知道应用层的进程间通信无非Broadcast,Activity,Service,Content Provider四大组件.Broa ...

  8. Linux下svn的安装与部署

    最近工作碰到一个问题,我和一个同伙负责开发一个管理系统,基于原来的代码上进行修改,每当他修改之后,我要再修改都要和他确定是不是最新的文件,才能进行修改.非常影响工作的效率,所以在网上找了关于svn的使 ...

  9. 【学习笔记】--- 老男孩学Python,day10, 初识函数 形参、实参

    函数:对功能的封装语法: def 函数名(形参): 函数体 函数名(实参) 函数名:命名规则和变量一样 函数的返回值: return, 函数执行完毕. 不会执行后面逻辑 1. 如果函数中不写retur ...

  10. Effective C++ Placement new

    #include <iostream> #include <cstdlib> using namespace std; class Card { private: int m_ ...