IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)-B - Bear and Compressing-暴力DP

http://codeforces.com/contest/653/problem/B


给你n,q

q是置换规则,每一个规则把2个字母置换成1个


要求你构造出一个长度为n的字符串,使得满足:

每次取最前两个字母进行置换,最终整个字符串能变成 一个字母a


数据太小。暴力dp一下就好。。。


初始化,dp[1][i]=1

之前先把两个字母和一个字母映射起来,

dp[i][j]表示第i次置换是字符串J  (两个字母叫字符串)

对dp[i][j]!=0时;

在map表里找到 字符串j 置换成的 字母。

然后如果该字母+(a到f)能构成一个新的可置换字符串,则dp[i][new]+=dp[i][j],new是新字符串的序号


最后把dp[n-1][j]中,字符串【j】置换结果==‘a’的答案都加起来就OK

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
 
const double pi=acos(-1.0);
double eps=0.000001; 
int min(int a,int b)
{return a<b?a:b;} 
int max(int a,int b)
{return a>b?a:b;}

string aa[38];
char bb[38];
int dp[30][38];
map<string,char>sb,num; 
int main()
{
int i,j;
	int n,q;
cin>>n>>q;
	for (i=1;i<=q;i++)
	{
		cin>>aa[i]; cin>>bb[i];
		sb[aa[i]]=bb[i];
		num[aa[i]]=i;
	}
	for (i=1;i<=q;i++)
		dp[1][i]=1;

	for (i=1;i<=n-2;i++)
	{
		for (j=1;j<=q;j++)
		{ 
			if (dp[i][j]==0) continue;
			for (char tt='a';tt<='f';tt++)
			{
			string tmp;tmp=sb[aa[j]];
			tmp+=tt;
			if (sb.count(tmp)==0) continue;
			dp[i+1][num[tmp]]+=dp[i][j];
			}
		}
	}
	int sum=0;
	for (i=1;i<=q;i++)
		if (dp[n-1][i])
		{
			if (sb[aa[i]]=='a')
		sum+=dp[n-1][i];//printf("%d:%d\n",i,dp[n-1][i]);
		}
	printf("%d\n",sum);







	return 0;
 
}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值