codeforces 543 C Remembering Strings
题意:若一个字符串集合里的每一个字符串都至少有一个字符满足在i位上,仅仅有它有,那么这个就是合法的,给出全部串的每一个字符修改的花费,求变成合法的最小代价。
做法:dp[i][j]。前i个串的状态为j时的最小花费。j:状压表示已经合法的是哪些串。
能够知道。若j前有i个1,那么訪问它就是多余的,所以去掉i,枚举j就可以。
对于一个串的i位。若考虑它为这个串的唯一标识。那么无非是改变它为唯一字符,或者改变其它串在i位跟它同样的字符,又由于改变其它串的字符。能够贪心成顺便也都把它们变成合法的,所以若其它串有x个,能够再贪心成从这x+1个串中去掉代价最大的那个串,改变剩下x个串。得到x个合法串。
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<climits>
#include<list>
#include<iomanip>
#include<stack>
#include<set>
using namespace std;
int val[30][30],cost[30][30],mark[30][30];
string s[30];
int dp[1<<20];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>s[i];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>cost[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
int mx=0;
for(int k=0;k<n;k++)
if(s[i][j]==s[k][j])
{
val[i][j]+=cost[k][j];
mx=max(mx,cost[k][j]);
mark[i][j]|=1<<k;
}
val[i][j]-=mx;
}
int len=(1<<n)-1;
memset(dp,63,sizeof(dp));
dp[0]=0;
for(int i=0;i<len;i++)
{
for(int j=0;;j++)
if(!((i>>j)&1))
{
for(int k=0;k<m;k++)
{
dp[i|(1<<j)]=min(dp[i|(1<<j)],dp[i]+cost[j][k]);
dp[i|mark[j][k]]=min(dp[i|mark[j][k]],dp[i]+val[j][k]);
}
break;
}
}
cout<<dp[len];
}
2 seconds
256 megabytes
standard input
standard output
You have multiset of n strings of the same length, consisting of lowercase English letters. We will say that those strings are easy
to remember if for each string there is some position i and some letter c of
the English alphabet, such that this string is the only string in the multiset that has letter c in position i.
For example, a multiset of strings {"abc", "aba", "adc", "ada"} are not easy to remember. And multiset {"abc", "ada", "ssa"} is easy to remember because:
- the first string is the only string that has character c in position 3;
- the second string is the only string that has character d in position 2;
- the third string is the only string that has character s in position 2.
You want to change your multiset a little so that it is easy to remember. For aij coins,
you can change character in the j-th position of thei-th
string into any other lowercase letter of the English alphabet. Find what is the minimum sum you should pay in order to make the multiset of strings easy to remember.
The first line contains two integers n, m (1 ≤ n, m ≤ 20) —
the number of strings in the multiset and the length of the strings respectively. Next n lines contain the strings of the multiset,
consisting only of lowercase English letters, each string's length is m.
Next n lines contain m integers
each, the i-th of them contains integers ai1, ai2, ..., aim (0 ≤ aij ≤ 106).
Print a single number — the answer to the problem.
4 5
abcde
abcde
abcde
abcde
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
3
4 3
abc
aba
adc
ada
10 10 10
10 1 10
10 10 10
10 1 10
2
3 3
abc
ada
ssa
1 1 1
1 1 1
1 1 1
0
codeforces 543 C Remembering Strings的更多相关文章
- Codeforces Round #302 (Div. 1) C. Remembering Strings DP
C. Remembering Strings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...
- Codeforces Round #302 (Div. 1) C - Remembering Strings 状压dp
C - Remembering Strings 思路:最关键的一点是字符的个数比串的个数多. 然后就能状压啦. #include<bits/stdc++.h> #define LL lon ...
- Codeforces 385B Bear and Strings
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...
- Codeforces 482C Game with Strings(dp+概率)
题目链接:Codeforces 482C Game with Strings 题目大意:给定N个字符串,如今从中选定一个字符串为答案串,你不知道答案串是哪个.可是能够通过询问来确定, 每次询问一个位置 ...
- Codeforces 544E Remembering Strings 状压dp
题目链接 题意: 给定n个长度均为m的字符串 以下n行给出字符串 以下n*m的矩阵表示把相应的字母改动成其它字母的花费. 问: 对于一个字符串,若它是easy to remembering 当 它存在 ...
- Codeforces 543C Remembering Strings(DP)
题意比较麻烦 见题目链接 Solution: 非常值得注意的一点是题目给出的范围只有20,而众所周知字母表里有26个字母.于是显然对一个字母进行变换后是不影响到其它字符串的. 20的范围恰好又是常见状 ...
- Codeforces 543 B. World Tour
http://codeforces.com/problemset/problem/543/B 题意: 给定一张边权均为1的无向图. 问至多可以删除多少边,使得s1到t1的最短路不超过l1,s2到t2的 ...
- 【24.34%】【codeforces 560D】Equivalent Strings
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- CodeForces 682D Alyona and Strings (四维DP)
Alyona and Strings 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/D Description After re ...
随机推荐
- Java常用知识(长期更新)
1.0转义符 \n:换行 ,\n的作用和print后面的ln相同,可酌情使用 \t:一个制表位(一系列空格) 例: public class Schedule{ public static void ...
- bzoj1001: [BeiJing2006]狼抓兔子(初识是你最小割)
1001: [BeiJing2006]狼抓兔子 题目:传送门 题解: 听说这题当初是大难题...可惜当年没有网络流hahahha 现在用网络流的思想就很容易解决了嘛 给什么连什么,注意是双向边,然后跑 ...
- Automation testing tool comparison - UFT & CodedUITest
Ease of Use - Recording and Playback Functionality UFT provides 4 models to record a new test. Norma ...
- Sequences of sequences
I have focused on lists of tuples, but almost all the examples in this chapter also work with lists ...
- OpenGL编程逐步深入(八)伸缩变换
准备知识 伸缩变换非常简单,它的目的是增大或者缩小对象的尺寸.例如:你可能希望用同一个模型创建不同大小的对象(例如形状相同,但大小不同的树木)或者你想改变对象的大小使它和游戏场景匹配.这些例子中你可能 ...
- PostgreSQL Replication之第八章 与pgbouncer一起工作(1)
当您在使用大规模的设施工作,可能有时候,您必须处理许多并发打开的连接.没有人会使用十台服务器来为两个并发用户提供服务--在许多情况下,这根本没有意义.大量的设施通常会处理成百上千的并发连接.引入连接池 ...
- HDU 5214 Movie【贪心】
题意:给出n,l[1],r[1],a,b,c,d 其中 l[i]=l[i-1]*a+b,r[i]=r[i-1]*c+d; 问能否从这n个区间中选出不相交不重叠的三个区间 看的题解 先考虑最左边的区间, ...
- 安装Debugging Tools时出现错误Setup could not find the file WinSDK_amd64的处理
安装Debugging Tools时出现错误Setup could not find the file WinSDK_amd64的处理 1.软件来源: 微软官网下载SDK ISO安装包(含有debu ...
- DELL T430进RAID的方式:, 硬盘损坏后的处理方式
**DELL T430 新机安装2块硬盘后进RAID的方式: ** 一. BIOS更改 1.改启动方式为RAID mode : 开机按F2进入BIOS 界面 --->System BIOS - ...
- AOC 电视机T3212M 进入 工厂模式方法,修改开机启动方式
原启动方式: 通电,再按遥控 器上 “开机” 希望改成: 通电直接打开电视 方法: 1. 按遥控器上的 menu 1147 进入 工厂模式 2. 选择 7 General Settin ...