ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P4290 玩具取名

2022-04-22 01:34:40  阅读:158  来源: 互联网

标签:opt ch return int 压缩成 取名 玩具 P4290 change


感谢所有AC

传送门

思路

       一道求解存在性的区间dp,思路非常巧妙。对于原名字串,通过压缩变换,如果最后能够压缩成单个字母则该字母为一个答案。

       如何实现压缩的过程?设计状态 $f(i,j,k)$ 为原串从位置 $i$ 到位置 $j$ 压缩成 $k$ 的可能性。$opt(l,r,t)$ 为 $l$ 和 $r$ 压缩成t的可能性,$opt$ 状态用来存储变换规则。同时,为了方便表示,把四个字母转化成数字。

       转移方程为 $f(i,j,k) = f(i,d,x)\ \&\& \ f(d+1,j,y)\ \&\& \ opt(x,y,k)$ 形式上也是比较好理解的,两个字母压缩成一个字母,只要一个条件不存在,整个转移不存在。但是需要注意的是,如果不对三个条件进行判断,需要在转移时加上或运算符。因为可能出现一个压缩在第一次转移时判断为存在,但是在第二次转移时由于条件不符合而被判断为不存在。

代码

#include<iostream>
#include<cstring>
using namespace std;
int W, I, N, G;
string ch;
bool opt[10][10][10], f[205][205][205], flag;
int change(char ch)
{
	if (ch == 'W')return 1;
	if (ch == 'I')return 2;
	if (ch == 'N')return 3;
	if (ch == 'G')return 4;
}
int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> W >> I >> N >> G;
	for (int i = 1; i <= W; i++)
		cin >> ch, opt[change(ch[0])][change(ch[1])][1] = 1;
	for (int i = 1; i <= I; i++)
		cin >> ch, opt[change(ch[0])][change(ch[1])][2] = 1; 
	for (int i = 1; i <= N; i++)
		cin >> ch, opt[change(ch[0])][change(ch[1])][3] = 1;
	for (int i = 1; i <= G; i++)
		cin >> ch, opt[change(ch[0])][change(ch[1])][4] = 1;
	cin >> ch;
	for (int i = 1; i <= ch.size(); i++)
		f[i][i][change(ch[i - 1])] = 1;
	for (int L = 2; L <= ch.size(); L++)
		for (int i = 1, j = i + L - 1; j <= ch.size(); i++, j++)
			for (int k = i; k < j; k++)
				for (int r = 1; r <= 4; r++)
					for (int x = 1; x <= 4; x++)
						for (int y = 1; y <= 4; y++)
							f[i][j][r] |= (f[i][k][x] && f[k + 1][j][y] && opt[x][y][r]);
	if (f[1][ch.size()][1])cout << 'W', flag = 1;
	if (f[1][ch.size()][2])cout << 'I', flag = 1;
	if (f[1][ch.size()][3])cout << 'N', flag = 1;
	if (f[1][ch.size()][4])cout << 'G', flag = 1;
	if (!flag)cout << "The name is wrong!" << endl;
	return 0;
}

 

标签:opt,ch,return,int,压缩成,取名,玩具,P4290,change
来源: https://www.cnblogs.com/xqk0225/p/16177207.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有