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 ...
随机推荐
- 可变对象 vs 不可变对象(Python)
Python 在 heap 中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如 list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string ...
- CAP定理在分布式系统设计中的最新应用
本文翻译自国外InfoQ和计算机杂志上一篇2012年旧文,本文就有关数据同步进行了讨论,特别关注业务事务的不变性与一致性如何在分布式系统中巧妙保证,探讨了长时间运行的事务的补偿机制.这些对分布式系统设 ...
- <a>标签是什么意思 怎么使用?
转自:https://www.imooc.com/qadetail/190881 (1) a标签的作用:超链接,用于跳转到别的网页. (2) a标签的用法:<a href="网址&qu ...
- Copying lists
When you assign an object to a variable, Python copies the reference to the object. In this case a a ...
- Linux-php7安装redis
Linux-php7安装redis 标签(空格分隔): 未分类 安装redis服务 1 下载redis cd /usr/local/ 进入安装目录 wget http://download.redis ...
- hdu1978 How many ways
How many ways Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 机器人一开始在棋 ...
- 数位$dp$
数位\(dp\)搞了一上午才搞懂.靠这种傻\(X\)的东西竟然花了我一上午的时间. 数位\(dp\) 概念 数位\(dp\)就是强制你分类一些数,例如给你一段区间,然后让你求出不包含\(2\)的数的个 ...
- Mojo Associated Interfaces
Mojo Associated Interfaces yzshen@chromium.org 02/22/2017 Background Before associated interfaces ar ...
- bzoj 1588 [HNOI2002] 营业额统计 链表和Splay
来自HNOI 2002营业额的统计一题,这题以前是用链表水过的,最近看见许多splay的题,赶紧张一下知识. 题目大意就是对于一个序列,输出每个元素与它之前元素的差的最小值的和.先说链表的方法吧. 大 ...
- python supper()函数
参考链接:https://www.runoob.com/python/python-func-super.html super() 函数是用于调用父类(超类)的一个方法. class Field(ob ...