恩科尔愿意为朱伦做任何事,甚至愿意游过鳄鱼出没的沼泽。我们决定测试一下这份爱。恩科尔必须游过一条宽 11 米、长 𝑛𝑛 米的河流。
河水非常冷。因此,***(即从 00 游到 𝑛+1𝑛+1 的整个过程)恩科尔在水里游的距离不超过 𝑘𝑘 米。为了人性化起见,我们不仅在河里加入了鳄鱼,还加入了可以让他跳上去的圆木。我们的测试如下
一开始,恩科尔在左岸,需要到达右岸。它们分别位于 00 和 𝑛+1𝑛+1 米处。河道可以表示为 𝑛𝑛 个河段,每个河段的长度为 11 米。每个河段都包含原木 "L"、鳄鱼 "C "或水 "W"。恩科的移动方式如下
- 如果他在水面上(即岸边或圆木上),他可以向前跳跃不超过 𝑚𝑚 ( 1≤𝑚≤101≤𝑚≤10 )。( 1≤𝑚≤101≤𝑚≤10 ) 米(他可以在岸上、原木上或水中跳跃)。
- 如果他在水中,他只能游到下一个河段(如果他在 𝑛𝑛 /-米处,则只能游到岸边)。
- 无论如何,ErnKor 都不能在有鳄鱼的河段登陆。
确定恩科尔能否到达右岸。
输入
第一行包含一个整数 𝑡𝑡 ( 1≤𝑡≤1041≤𝑡≤104 ) - 测试用例数。
每个测试用例的第一行包含三个数字 𝑛,𝑚,𝑘𝑛,𝑚,𝑘 ( 0≤𝑘≤2⋅1050≤𝑘≤2⋅105 , 1≤𝑛≤2⋅1051≤𝑛≤2⋅105 , 1≤𝑚≤101≤𝑚≤10 )--河流的长度、恩科尔可以跳跃的距离,以及恩科尔在不受冻的情况下可以游泳的米数。
每个测试用例的第二行包含长度为 𝑛𝑛 的字符串 𝑎𝑎 。 𝑎𝑖𝑎𝑖 表示位于 𝑖𝑖 /-米处的物体。( 𝑎𝑖∈{𝑎𝑖∈{ 'W','C','L' }} )
保证所有测试用例的 𝑛𝑛 之和不超过 2⋅1052⋅105 。
输出
对于每个测试用例,如果 ErnKor 可以通过测试,则输出 "YES",否则输出 "NO"。
您可以用任何大小写(大写或小写)输出答案。例如,字符串 "yEs"、"yes"、"Yes "和 "YES "将被识别为肯定回答。
做法
如果前m-1格有水直接跳过去,后面再游。怎么说这题用到了递推,对我来说还挺新颖的这个做法。记录一下吧qwq。感觉这种只能看题解理解理解了,自己写根本写不出来。。。
#include<bits/stdc++.h>
using namespace std;
int t,n,m,k;
int a[200100],b[200100];//是否走得到第i格,游到第i格用的“代价”
string s;
int main(){scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);cin>>s;for(int i=0;i<=n+10;i++) b[i]=0x3f3f3f3f,a[i]=0;//初始化for(int i=0;i<m;i++) {//从原点跳m的范围a[i]=1;b[i]=0;}for(int i=0;i<n;i++){if(s[i]=='C') continue;//鳄鱼if(b[i]>k) continue;//代价超过kif(s[i]=='W') a[i+1]=1,b[i+1]=min(b[i+1],b[i]+1);//游水的代价else{//跳m的范围for(int j=1;j<=m;j++) {a[i+j]=1;b[i+j]=min(b[i+j],b[i]);}}}if(a[n]==1&&b[n]<=k) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
}