来源:牛客网
题目描述
有一只乌龟,初始在0的位置向右跑。
这只乌龟会依次接到一串指令,指令T表示向后转,指令F表示向前移动一个单位。乌龟不能忽视任何指令。
现在我们要修改其中正好n个指令(一个指令可以被改多次,一次修改定义为把某一个T变成F或把某一个F变成T)。
求这只乌龟在结束的时候离起点的最远距离。(假设乌龟最后的位置为x,我们想要abs(x)最大,输出最大的abs(x))
这只乌龟会依次接到一串指令,指令T表示向后转,指令F表示向前移动一个单位。乌龟不能忽视任何指令。
现在我们要修改其中正好n个指令(一个指令可以被改多次,一次修改定义为把某一个T变成F或把某一个F变成T)。
求这只乌龟在结束的时候离起点的最远距离。(假设乌龟最后的位置为x,我们想要abs(x)最大,输出最大的abs(x))
输入描述:
第一行一个字符串c表示指令串。c只由F和T构成。 第二行一个整数n。 1 <= |c| <= 100, 1 <= n <= 50
题解: dfs遍历每一种可能。但如果不剪枝会超时, 可以用mp标记每一种状态,而状态最多不会超过一百万。 代码: #include<bits/stdc++.h> using namespace std; char t[107]; bool mp[107][55][207][2]; int n,L,ma=0; int abs1(int x) { return x<0?-x:x; } void dfs(int step,int s,int x,int d)//操作次数,剩余修改次数,位置,方向 { if(s<0)return; int t1;if(d==-1)t1=0;else t1=1; if(mp[step][s][x+100][t1])return;//剪枝 mp[step][s][x+100][t1]=1; if(step==L) { if(s%2==0) ma=max(ma,abs1(x)); return; } if(t[step]=='T') { dfs(step+1,s-1,x+d,d);//修改此位置 dfs(step+1,s,x,-d);//不修改此位置 } else { dfs(step+1,s,x+d,d); dfs(step+1,s-1,x,-d); } } int main() { scanf("%s%d",&t,&n); L=strlen(t); memset(mp,0,sizeof(mp)); dfs(0,n,0,1); printf("%d\n",ma); return 0; }