**cf957---D. Test of Love(递推)

恩科尔愿意为朱伦做任何事,甚至愿意游过鳄鱼出没的沼泽。我们决定测试一下这份爱。恩科尔必须游过一条宽 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;//代价超过k
    		if(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;
  	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值