2017-2018 ACM-ICPC Asia East Continent League Final H - Mr. Panda and Birthday Song(DP)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017-2018 ACM-ICPC Asia East Continent League Final H - Mr. Panda and Birthday Song(DP)相关的知识,希望对你有一定的参考价值。

题意

给定一个串,需要把 ? ? ?改成任意小写字母,形成新的串 s s s

连续出现元音长度 >= x || 连续出现辅音长度 >= y ,输出DISLIKE

连续出现元音长度 < x && 连续出现辅音长度 <y,输出LIKE

即满足1又满足2,输出SURPRISE


考虑每个位置要么是元音要么是辅音

我们可以得到为元音时的最短连续长度和为辅音的最短连续长度

这样就可以分开 d p dp dp作决策

f [ i ] [ 0 / 1 ] f[i][0/1] f[i][0/1]表示以 i i i结尾的最短连续元/辅音长度

a i a_i ai为元音

f [ i ] [ 0 ] = f [ i − 1 ] [ 0 ] + 1 , f [ i ] [ 1 ] = 0 f[i][0]=f[i-1][0]+1,f[i][1]=0 f[i][0]=f[i1][0]+1,f[i][1]=0

a i a_i ai为辅音

f [ i ] [ 1 ] = f [ i − 1 ] [ 1 ] + 1 , f [ i ] [ 0 ] = 0 f[i][1]=f[i-1][1]+1,f[i][0]=0 f[i][1]=f[i1][1]+1,f[i][0]=0

a i = ? a_i=? ai=?

当选择元音时一种转移

f [ i ] [ 0 ] = f [ i − 1 ] [ 0 ] + 1 , f [ i ] [ 1 ] = 0 f[i][0]=f[i-1][0]+1,f[i][1]=0 f[i][0]=f[i1][0]+1,f[i][1]=0

选择辅音时一种转移

f [ i ] [ 1 ] = f [ i − 1 ] [ 1 ] + 1 , f [ i ] [ 0 ] = 0 f[i][1]=f[i-1][1]+1,f[i][0]=0 f[i][1]=f[i1][1]+1,f[i][0]=0

如果出现一个位置使得 f [ i ] [ 0 ] > = x & & f [ i ] [ 1 ] > = y f[i][0]>=x\\&\\&f[i][1]>=y f[i][0]>=x&&f[i][1]>=y说明不满足

其实本质上是把状态变为决策内容的一类 d p dp dp,下次应该要快速反应了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e6+10;
int f[maxn][2],n,x,y,casenum;
char a[maxn];
bool solve()
{
	int le = 0, re = 0;
	for(int i=1;i<=n;i++)
	{
		if( a[i]=='?' )	le++,re++;
		else if( a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')
			le++, re = 0;
		else 
			re++, le = 0;
		if( le>=x || re>=y )	return true;
	}
	return false;
}
int main()
{
	//f[i][0]表示i位置为元音 
	//f[i][1]表示i位置为辅音是否有可能
	int t; cin >> t;
	while( t-- )
	{ 
		scanf("%s%d%d",a+1,&x,&y);
		n = strlen( a+1 );
		int flag1 = solve(), flag2 = true;
		for(int i=1;i<=n;i++)
		{
			if( a[i]=='?' )
			{
				int le = 1e9, re = 1e9;
				if( f[i-1][0]+1<x )//可以放元音 
					le = min( le,f[i-1][0]+1 ), re = 0;
				if( f[i-1][1]+1<y )//可以放辅音 
					le = 0, re = min( re,f[i-1][1]+1 );
				f[i][0] = le, f[i][1] = re;
				if( le>=x && re>=y )	flag2 = false;
			}
			else if( a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')
			{
				f[i][0] = f[i-1][0]+1, f[i][1] = 0;
				if( f[i][0]>=x )	flag2 = false; 
			}
			else
			{
				f[i][1] = f[i-1][1]+1, f[i][0] = 0;
				if( f[i][1]>=y )	flag2 = false;
			}
		}
	//	cout << flag1 << " " << flag2 << endl;
		printf("Case #%d: ",++casenum);
		if( flag1 && flag2 )	printf("SURPRISE\\n");
		else if( flag1 )	printf("DISLIKE\\n");
		else	printf("LIKE\\n");
	}
}

以上是关于2017-2018 ACM-ICPC Asia East Continent League Final H - Mr. Panda and Birthday Song(DP)的主要内容,如果未能解决你的问题,请参考以下文章

2017-2018 ACM-ICPC Asia Tsukuba Regional Contest

2017-2018 ACM-ICPC, Asia Daejeon Regional Contest

2017-2018 ACM-ICPC Asia East Continent League Final L. SOS(博弈,思维)

(好题)2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest F Pizza Delivery

2017-2018 ACM-ICPC Asia East Continent League Final J. Straight Master(差分+思维)

2017-2018 ACM-ICPC Asia East Continent League Final C. Traffic Light(思维)