Leyni的机器人 | ||||||
| ||||||
Description | ||||||
Leyni喜欢机器人,这次,他得到了一个机器人,这个机器人能接受两种命令,"T"(向后转),"F"(前进一步)。 他还得到了一个用于控制这个机器人的指令序列,他计划恰好修改k次这个指令序列(一次只能修改其中一个指令,同一个指令也可以被反复修改)后让机器人去执行,并使这个机器人最终停下的位置离起点尽量远。 他想知道这个机器人最终停下的位置离起点的最远距离,请你帮助他! | ||||||
Input | ||||||
本题有多组测试数据,输入的第一行是一个整数T代表着测试数据的数量,接下来是T组测试数据。 对于每组测试数据: 第1行 包含一个长度不超过100的仅由"T","F"组成的非空字符串s代表着原始指令序列。 第2行 包含一个整数k (1 ≤ k ≤ 50)代表着Leyni计划恰好修好这个指令序列的次数。 | ||||||
Output | ||||||
对于每组测试数据: 第1行 输出这个机器人最终停下的位置离起点的最远距离。 | ||||||
Sample Input | ||||||
1 TF 1 | ||||||
Sample Output | ||||||
2 | ||||||
Author | ||||||
齐达拉图@HRBUST |
思路:
1、这个题可能贪心也可以搞,但是还是为了保证稳妥,考虑dp:
①设定dp【i】【j】【k】表示进行到第i步指令,已经进行了j次修改,当前朝向为k的情况的最大值。
②我们规定初始机器人面朝的方向为前,那么设定k=0表示方向向前,k=1表示方向向后,对应向前走一步是值+1,向后走一步是值-1。
③那么我们考虑这样一个情况:我们改变了kk次之后,向后走是最优情况,那么很明显,我们此时希望dp【n-1】【kk】【0】/dp【n-1】【kk】【1】为负数并且尽可能的小,那么我们此时维护的dp【i】【j】【k】是最大值,显然不能够满足这样的情况发生,那么我们再设定一个dp2【i】【j】【k】,表示进行到第i步指令,已经进行了j次修改,当前朝向为k的情况的最小值。
2、设定出来两个dp数组之后,我们考虑其状态转移方程:
①我们首先初始化dp为-inf,初始化dp2为inf
②然后确定i==0的时候对应:
if(a【0】==‘F’&&i%2==0)表示操作为偶数次,相当于没有改变操作,即当前操作为向前走
dp【0】【i】【0】=1;
dp2【0】【i】【0】=1;
if(a【0】==‘T’&&i%2==0)表示操作为偶数次,相当于没有改变操作,即当前操作为转身
dp【0】【i】【1】=0;
dp2【0】【i】【1】=0;
if(a【0】==‘F’&&i%2==1)表示操作为奇数次,当前操作相当于转身
dp【0】【i】【1】=0;
dp2【0】【i】【1】=0;
if(a【0】==‘T’&&i%2==0)表示操作为奇数次,即当前操作相当于向前走
dp【0】【i】【0】=1;
dp2【0】【i】【0】=1;
③然后接下来我们确定i>=1&&i<n的情况:if((j-l)%2==0)
if(a【i】==‘F’)
dp【i】【j】【k】=max(dp【i】【j】【k】,dp【i-1】【l】【k】+k==0?1:-1);dp2【i】【j】【k】=min(dp2【i】【j】【k】,dp2【i-1】【l】【k】+k==0?1:-1);
if(a【i】==‘T’)
dp【i】【j】【k】=max(dp【i】【j】【k】,dp【i-1】【j】【1-k】);
dp2【i】【j】【k】=min(dp2【i】【j】【k】,dp2【i-1】【l】【1-k】);
if((j-l)%2==1)
if(a【i】==‘F’)
dp【i】【j】【k】=max(dp【i】【j】【k】,dp【i-1】【j】【1-k】);
dp2【i】【j】【k】=min(dp2【i】【j】【k】,dp2【i-1】【l】【1-k】);
if(a【i】==‘T’)
dp【i】【j】【k】=max(dp【i】【j】【k】,dp【i-1】【l】【k】+k==0?1:-1);
dp2【i】【j】【k】=min(dp2【i】【j】【k】,dp2【i-1】【l】【k】+k==0?1:-1);
3、对应注意上一状态是否存在在转移,剩下的内容就是实现代码了。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
char a[150];
int dp[255][155][2];
int dp2[255][155][2];
int kk;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,-0x3f3f3f3f,sizeof(dp));
memset(dp2,0x3f3f3f3f,sizeof(dp2));
scanf("%s",a);
scanf("%d",&kk);
int n=strlen(a);
for(int i=0;i<=kk;i++)
{
if(i%2==0)
{
if(a[0]=='F')
{
dp[0][i][0]=1;
dp2[0][i][0]=1;
}
else
{
dp[0][i][1]=0;
dp2[0][i][1]=0;
}
}
else
{
if(a[0]=='F')
{
dp[0][i][1]=0;
dp2[0][i][1]=0;
}
else
{
dp[0][i][0]=1;
dp2[0][i][0]=1;
}
}
}
///
for(int i=1;i<n;i++)
{
for(int j=0;j<=kk;j++)
{
for(int l=0;l<=j;l++)
{
if((j-l)%2==0)
{
if(a[i]=='F')
{
if(dp[i-1][l][0]!=-0x3f3f3f3f)
dp[i][j][0]=max(dp[i-1][l][0]+1,dp[i][j][0]);
if(dp[i-1][l][1]!=-0x3f3f3f3f)
dp[i][j][1]=max(dp[i-1][l][1]-1,dp[i][j][1]);
if(dp2[i-1][l][0]!=0x3f3f3f3f)
dp2[i][j][0]=min(dp2[i-1][l][0]+1,dp2[i][j][0]);
if(dp2[i-1][l][1]!=0x3f3f3f3f)
dp2[i][j][1]=min(dp2[i-1][l][1]-1,dp2[i][j][1]);
}
else
{
if(dp[i-1][l][1]!=-0x3f3f3f3f)
dp[i][j][0]=max(dp[i-1][l][1],dp[i][j][0]);
if(dp[i-1][l][0]!=-0x3f3f3f3f)
dp[i][j][1]=max(dp[i-1][l][0],dp[i][j][1]);
if(dp2[i-1][l][1]!=0x3f3f3f3f)
dp2[i][j][0]=min(dp2[i-1][l][1],dp2[i][j][0]);
if(dp2[i-1][l][0]!=0x3f3f3f3f)
dp2[i][j][1]=min(dp2[i-1][l][0],dp2[i][j][1]);
}
}
else
{
if(a[i]=='F')
{
if(dp[i-1][l][1]!=-0x3f3f3f3f)
dp[i][j][0]=max(dp[i-1][l][1],dp[i][j][0]);
if(dp[i-1][l][0]!=-0x3f3f3f3f)
dp[i][j][1]=max(dp[i-1][l][0],dp[i][j][1]);
if(dp2[i-1][l][1]!=0x3f3f3f3f)
dp2[i][j][0]=min(dp2[i-1][l][1],dp2[i][j][0]);
if(dp2[i-1][l][0]!=0x3f3f3f3f)
dp2[i][j][1]=min(dp2[i-1][l][0],dp2[i][j][1]);
}
else
{
if(dp[i-1][l][0]!=-0x3f3f3f3f)
dp[i][j][0]=max(dp[i-1][l][0]+1,dp[i][j][0]);
if(dp[i-1][l][1]!=-0x3f3f3f3f)
dp[i][j][1]=max(dp[i-1][l][1]-1,dp[i][j][1]);
if(dp2[i-1][l][0]!=0x3f3f3f3f)
dp2[i][j][0]=min(dp2[i-1][l][0]+1,dp2[i][j][0]);
if(dp2[i-1][l][1]!=0x3f3f3f3f)
dp2[i][j][1]=min(dp2[i-1][l][1]-1,dp2[i][j][1]);
}
}
}
}
}
int output=0;
if(dp[n-1][kk][0]!=-0x3f3f3f3f)output=dp[n-1][kk][0];
if(dp[n-1][kk][1]!=-0x3f3f3f3f)output=max(dp[n-1][kk][1],output);
if(dp2[n-1][kk][0]!=0x3f3f3f3f)output=max(abs(dp2[n-1][kk][0]),output);
if(dp2[n-1][kk][1]!=0x3f3f3f3f)output=max(abs(dp2[n-1][kk][1]),output);
printf("%d\n",output);
}
}