codeforces 543C C. Remembering Strings

原创 2015年11月20日 16:28:20

51nod:好记的字符串


题意:给定n个长度为m的字符串。为了让每个字符串变为独特的(该字符串的某一个位置存在一个字符ch,其他串的这个位置都不存在这个字符ch),你可以改变某些字符串的某些字符。现在告诉你改变每个字符的代价,求让所有的串成为独特的串的最小代价。


分析:定义dp[bitmask],bitmask的二进制中的1表示该位表示的字符串是独特,dp[bitmask]表示到达bitmask这个状态的最小代价。

两个转移:

1、直接修改字母

2、把这一列中所有与这个字母相同的字母都修改成别的字母。

当然可以剩下一个,剩下花费最大的那个即可。

cost[i][j] 就表示除了花费最大的那个 同列中与str[i][j]字母相同的花费和。

bit[i][j] 表示哪些字符串 在第j列 与 a[i][j] 字母相同。

  • 修改第i个字符串的第j个字符时,满足转移方程:
    dp[i][state|(1<<j)]=min{dp[i1][state]+cost[i][j]}
  • 修改一组字符串的第j个字母使他们全部合法的转移方程是: 
    dp[i][state|set]=min{dp[i1][state]+costset[j]}

复杂度是O(2nmn) 

由于state最后是由小变大(或者由大变小),每次枚举state时只要枚举合法的state,所以复杂度优化为O(2nm) 


以下程序里1与0反着写,1代表不是好记的,0代表好记的,这样好写for循环。

虽然3重for循环,实际复杂度O(2nm)

#include <cstdio>
using namespace std;

#define mylen 21
#define maxfigure 1000000000
int n, m;
char s[mylen][mylen];
int c[mylen][mylen];
int f[mylen][mylen];
int bit[mylen][mylen];
int result[(1 << mylen)];

int main()
{
	scanf("%d%d", &n,&m);
	for (int i = 0; i < n; ++i)
	{
		scanf("%s", s[i]);
	}

	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < m;++j)
		{
			scanf("%d", &c[i][j]);
		}
	}

	for (int i = n - 1; i >= 0; --i)			//初始化所有代价
	{
		for (int k = 0; k < m; ++k)
		{
			if (f[i][k])
			{
				bit[i][k] = bit[f[i][k]][k];
				f[i][k] = f[f[i][k]][k];
				continue;
			}

			int tmp = f[i][k] = c[i][k];
			bit[i][k] = (1 << i);

			for (int j = i-1; j >=0; --j)
			{
				if (s[i][k] == s[j][k])
				{
					f[j][k] = i;

					f[i][k] += c[j][k];
					bit[i][k] |= (1 << j);

					if (tmp < c[j][k])
					{
						tmp = c[j][k];
					}
				}
			}
			f[i][k] -= tmp;
			bit[i][k] = (~bit[i][k])&((1 << n) - 1);
		}
	}

	
	int  tmp1 = (1 << n), tmp2, tmp, state, state1;

	for (int i = tmp1-2; i >= 0; --i)
	{
		result[i] = maxfigure;
	}
	result[tmp1 - 1] = 0;

	for (int i = n-1; i >= 0;--i)
	{		
		tmp2 = tmp1 - 1;
		tmp1 = (1 << i);
		state1 = ~tmp1;

		for (int k = 0; k < m;++k)
		{
			for (int j = tmp1; j <= tmp2; ++j)
			{
				state = j&bit[i][k];
				tmp = result[j] + f[i][k];
				if (result[state] > tmp)
				{
					result[state] = tmp;
				}


				state = j & state1;
				tmp = result[j] + c[i][k];
				if (result[state] > tmp)
				{
					result[state] = tmp;
				}
			}
			
		}
	}



	printf("%d", result[0]);

	return 0;
}



O(2nm)
版权声明:本文为博主原创文章,未经博主允许不得转载。

CodeForces 165C--字符串(暴力)

题意: 给一个数字 k (k k 的子串? 输入: 1       1010 2       01010 100   01010 输出: 6 4 0 分析:直接暴...
  • shao1996
  • shao1996
  • 2016年07月14日 16:08
  • 173

codeforces 776C Molly's Chemicals(连续子序列和为k的次方的个数)

C. Molly's Chemicals time limit per test 2.5 seconds memory limit per test 512 megabytes input...
  • zwj1452267376
  • zwj1452267376
  • 2017年02月24日 02:47
  • 870

Codeforces 432C Prime Swaps【筛法素数预处理+贪心】

C. Prime Swaps time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu...
  • mengxiang000000
  • mengxiang000000
  • 2016年10月11日 21:40
  • 417

Codeforces Round #406 (Div. 2):C. Berzerk(记忆化搜索解决博弈问题)

C. Berzerk time limit per test 4 seconds memory limit per test 256 megabytes input standard in...
  • Jaihk662
  • Jaihk662
  • 2017年03月24日 15:23
  • 801

【codeforces 732E】【贪心 map乱搞】

传送门:http://codeforces.com/contest/732/problem/E 描述: E. Sockets time limit per t...
  • guhaiteng
  • guhaiteng
  • 2016年10月22日 15:32
  • 549

codeforces上一种应对大测试数据debug方法

接触codeforces时间不长,也就参加了10场左右。之前有次比赛就出现了wa了一道题,在比赛结束后看测试数据log时,发现出错的那组用例是个超过一万行输入的情况,codeforces上的测试数据无...
  • qq_29070399
  • qq_29070399
  • 2017年02月03日 16:09
  • 771

关于codeforces比赛规则介绍(转载)

Codeforces 简称: cf(所以谈论cf的时候经常被误会成TX的那款游戏). 网址: codeforces.com   这是一个俄国的算法竞赛网站,由来自萨拉托夫州立大学、由Mike Mirz...
  • y990041769
  • y990041769
  • 2014年02月19日 08:41
  • 15585

python爬虫抓取codeforces分数

环境介绍 python 2.7.2 re 正则表达式库 urllib2 代码#coding:utf8 import sys import urllib2,redef getrating(name): ...
  • qscqesze
  • qscqesze
  • 2016年11月17日 22:02
  • 474

Codeforces 708D 费用流 (呃我们的考试题)

NB的题目背景 输入输出一样考试的时候貌似只有gzz一个人搞出来了 %gzz思路: 分情况讨论 add(x,y,C,E) C是费用 E是流量 1. f>c add(x,y,2,inf),...
  • qq_31785871
  • qq_31785871
  • 2017年01月05日 17:56
  • 732

看代码,学strings包

golang strings
  • zistxym
  • zistxym
  • 2016年09月09日 20:18
  • 1229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces 543C C. Remembering Strings
举报原因:
原因补充:

(最多只允许输入30个字)