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
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?
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).
Print the minimal length of the new array a, such that a contains all the given subarrays in the input inside it as subarrays.
3
2 1 2
4 3 4 5 6
3 2 3 4
6
5
3 4 7 5
4 7 9 2 5
3 7 5 2
4 5 1 4 7
4 9 2 5 1
9
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】的更多相关文章
- gym101343J. Husam and the Broken Present 2 (状压DP)
题意:给定n个串 每个串长度不超过100 找到一个新串 使得这n个串都是它的字串 输出这个新串的最小长度 题解:n是15 n的阶乘的复杂度肯定不行 就想到了2的15次方的复杂度 想到了状压但是不知道怎 ...
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)
http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...
- 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 ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
- 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 ...
- codeforces Diagrams & Tableaux1 (状压DP)
http://codeforces.com/gym/100405 D题 题在pdf里 codeforces.com/gym/100405/attachments/download/2331/20132 ...
- 状压dp Gym - 100676G
http://codeforces.com/gym/100676 题目大意: 给你n个科目,m个关系,例如A->B,表示要学习B科目,一定要把A科目学习掉.同理,如果还有C->B,那么,B ...
- 状压dp Codeforces Beta Round #8 C
http://codeforces.com/contest/8/problem/C 题目大意:给你一个坐标系,给你一个人的目前的坐标(该坐标也是垃圾桶的坐标),再给你n个垃圾的坐标,这个人要捡完所有的 ...
随机推荐
- 算法:QQ等级换算成皇冠太阳星星月亮
/// <summary> /// 等级换算成图标分布 /// 以QQ的形式计算 /// 2^(2*0) /1 /// 2^(2*1) /4 /// 2^(2*2) /16 ...
- VIM命令图解
右键在新窗口打开查看大图 删除所有:dG 来源见水印
- Why we should overwrite the hashCode() when we overwrite the equals()
Preface Though I have used Java programme language for almost a year, I'm not familiar with a notion ...
- android chrome iframe设置src属性无法启动app
0x01 Android Intents with Chrome Android有一个很少人知道的特性可以通过web页面发送intent来启动apps.以前通过网页启动app是通过设置iframe的s ...
- Android 退出整个应用程序
我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者直接按home键直接返回,其实这两种操作都没有关闭当前应用程序,没有释放 ...
- 注重结构、语义、用户体验的Tab选项卡
效果如下图所示: HTML code: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...
- React—Native开发之原生模块向JavaScript发送事件
首先,由RN中文网关于原生模块(Android)的介绍可以看到,RN前端与原生模块之 间通信,主要有三种方法: (1)使用回调函数Callback,它提供了一个函数来把返回值传回给JavaScript ...
- LeetCode 536----Construct Binary Tree from String
536. Construct Binary Tree from String You need to construct a binary tree from a string consisting ...
- 网络I/O模型--05多路复用I/O
多路复用I/O模型在应用层工作效率比我们俗称的 BIO 模型快的本质原因是,前者不再使用操作系统级别的“同步 I/O”模型 . 在 Linux 操作系统环境下, 多路复用 I/O 模型就是技术人员通常 ...
- 百度网盘下载器 PanDownload v2.0
PanDownload是一款坚持以用户体验为中心,畅快淋漓的下载为理念而打造的下载工具. 从2017年2月9日首个版本推出,时至今日已经一年七个月了,首先感谢大家一直以来的支持与建议,促使着我不断地对 ...