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个垃圾的坐标,这个人要捡完所有的 ...
随机推荐
- ArchLinux - 安装指南
Step 1 将镜像写入u盘 u盘从来不是唯一的选择,但多数人可能喜欢这么做. 我是在OS X上进行操作,如果你用的是windows,也许可以使用Image Writer for Windows或者U ...
- Java基础教程(9)--流程控制
一.分支结构 1.if语句 if语句会与其后的第一条语句或代码块结合,且只有当判断条件为true时才执行语句或代码块.例如,自行车只有在运动的时候才可以减速,就像下面这样: void applyB ...
- elasticsearch 6.3 安装手记
系统环境 centos 7 elasticsearch 6.3 需要 JDK 8 版本,先安装 JDK 8. ES6.3 安装地址: https://www.elastic.co/guide/en/e ...
- github 上如何直接预览仓库中的html,搭建自己的主页
前言:最近在写vue+element ui 的一些demo,就在github上建了个仓库来管理,但是希望能直接在github上就能预览效果,所以才有了这篇文章.转载请注明出处:https://www. ...
- 在windows上搭建redis集群(redis-cluster)
一 所需软件:Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb 二 安装配置redis redis下载地址 ...
- request获取当前用户
1.request.getRemoteUser();//获取当前缓存的用户,比如Spring Security做权限控制后就会将用户登录名缓存到这里 request.getRemoteAddr();/ ...
- OpenGL学习--07--模型加载(obj)
1.tutorial07.cpp // Include standard headers #include <stdio.h> #include <stdlib.h> #inc ...
- Flare-On4 解题复现
01 是一个 html 页面, 用开发者工具看看,发现是简单的 js 加密. 猜测加密算法可逆,试着用 PyvragFvqrYbtvafNerRnfl@syner-ba.pbz 作为输入,然后调试 , ...
- 关于jsp页面中时间显示问题
首先说明一下情况,在MySQL数据库中获取的时间显示在jsp页面中不是按指定格式显示,显示的是类似于这种--Tue Jun 18 00:00:00 CST 2013.而想要的仅仅是年月日而已. 对于这 ...
- node(3)MVC代码结构模式moogoDB的学习
---恢复内容开始--- 一.MVC代码结构模式 设计模式:观察者模式.中介者模式,这种模式,主要做的事情是处理类与类之间‘高内聚.低耦合’; 代码架构模式:MVC.MVVM.MVP Model:模型 ...