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[i−1][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[i−1][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[i−1][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[i−1][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(思维)