题意比较麻烦

见题目链接


Solution:

   非常值得注意的一点是题目给出的范围只有20,而众所周知字母表里有26个字母。于是显然对一个字母进行变换后是不影响到其它字符串的。

20的范围恰好又是常见状压DP的范围,所有状态压缩后用DP[sta]代表对应位的字符串已经满足要求的最小花费。

转移的时候,对一个字符串,逐列判断使它满足条件的最小花费,记录使用这个策略对sta的影响。

即对同一列有两种情况,直接变换该字符串的这一位,或者变换这一列的sum-1个有相同字符的位置(去掉代价最大的)。

#include <bits/stdc++.h>
using namespace std; int dp[ << ];
int cost[][], f[][], change[][]; int n, m;
char s[][]; inline void getCost ()
{
for (int k = ; k < n; ++k)
{
for (int i = ; i < m; ++i)
{
int sum = , tem = ;
f[i][k] = 0x7fffffff;
for (int j = ; j < n; ++j)
{
if (s[j][i] == s[k][i])
{
change[i][k] |= << j;
sum += cost[j][i];
tem = max (tem, cost[j][i]);
}
}
f[i][k] = min (f[i][k], sum - tem);
}
}
} int main()
{
ios::sync_with_stdio (); cin >> n >> m;
for (int i = ; i < n; ++i)
cin >> s[i]; for (int i = ; i < n; ++i)
for (int j = ; j < m; ++j)
cin >> cost[i][j]; getCost(); memset (dp, 0x3f, sizeof dp);
dp[] = ;
for (int st = ; st < ( << n); ++st)
{
for (int i = ; i < n; ++i)
{
if ( (st & << i) == )
{
for (int j = ; j < m; ++j)
{
dp[st | change[j][i]] = min (dp[st | change[j][i]], dp[st] + f[j][i]);
dp[st | << i] = min (dp[st | << i], dp[st] + cost[i][j]);
}
break;
}
}
}
cout << dp[ ( << n) - ] << endl;
}

Codeforces 543C Remembering Strings(DP)的更多相关文章

  1. Codeforces Gym101341K:Competitions(DP)

    http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...

  2. Codeforces 682D Alyona and Strings(DP)

    题目大概说给两个字符串s和t,然后要求一个包含k个字符串的序列,而这个序列是两个字符串的公共子序列,问这个序列包含的字符串的总长最多是多少. 如果用DP解,考虑到问题的规模,自然这么表示状态: dp[ ...

  3. codeforces 711C Coloring Trees(DP)

    题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...

  4. HDU 6170----Two strings(DP)

    题目链接 Problem Description Giving two strings and you should judge if they are matched.The first strin ...

  5. codeforces#1154F. Shovels Shop (dp)

    题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...

  6. Codeforces 1051 D.Bicolorings(DP)

    Codeforces 1051 D.Bicolorings 题意:一个2×n的方格纸,用黑白给格子涂色,要求分出k个连通块,求方案数. 思路:用0,1表示黑白,则第i列可以涂00,01,10,11,( ...

  7. Codeforces 1207C Gas Pipeline (dp)

    题目链接:http://codeforces.com/problemset/problem/1207/C 题目大意是给一条道路修管道,相隔一个单位的管道有两个柱子支撑,管道柱子高度可以是1可以是2,道 ...

  8. Codeforces 704C - Black Widow(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...

  9. Codeforces 682B New Skateboard(DP)

    题目大概说给一个数字组成的字符串问有几个子串其代表的数字(可以有前导0)能被4整除. dp[i][m]表示字符串0...i中mod 4为m的后缀的个数 通过在i-1添加str[i]字符转移,或者以st ...

随机推荐

  1. ExecuteScalar的学习日志

    一:今天写关于调用sqlhelper类的时候出现了一个异常,我仔细观察没有错误啊,怎么回事:看图 二:出现错误时id的结果是0,也就是说ExcuteScalar的结果是null,明明数据库里有多行数据 ...

  2. QT静态链接

    想把QT的程序链接成一个独立的EXE以方便使用,查了很多资料都需要自行编译QT. 搜索了很多的资料,发篇写得比较简明一些:http://my.oschina.net/weiweiqiao/blog/2 ...

  3. 把mysql 中的字符gb2312 改为gbk的方法

    第一步:查找mysql的字符: mysql> show variables like '%char%';+--------------------------+----------------- ...

  4. 佛山Uber优步司机奖励政策(1月18日~1月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  5. scrapy使用代理

    import base64 # Start your middleware class class ProxyMiddleware(object): # overwrite process reque ...

  6. 11个让你吃惊的Linux终端命令

  7. 小试牛刀——python接口测试小框架

    用例设计: 执行用例代码: # -*- coding: UTF-8 -*-import xlrd,logging,urllib,urllib2,json,sysfrom pylsy import py ...

  8. winform datagridview如何获取索引 分类: DataGridView 2014-04-11 13:42 216人阅读 评论(0) 收藏

    datagridview.CurrentCell.RowIndex;            是当前活动的单元格的行的索引 datagridview.SelectedRows  ;           ...

  9. Spring与Ibatis整合入门

    Ibatis作为一个将java对象与sql中的数据进行映射的工具,可以将一个应用中常用的sql操作抽象为模版,在应用后续与数据库的交互中,将输入sql语句简化为更改一部分参数. ibatis整合到sp ...

  10. [AngularJS + Unit Testing] Testing Directive's controller with bindToController, controllerAs and isolate scope

    <div> <h2>{{vm.userInfo.number}} - {{vm.userInfo.name}}</h2> </div> 'use str ...