做题过程想过dp,but不能很好的解决。
看了别人的题解才知道是记忆化搜索,生动形象!
思路:
·dp[i][x][pos][dir]:关于字符串的字符坐标/还需要进行几次操作/当前位置/乌龟走的方向
·乌龟在的位置可以为负值,但数组不能为负,因此定义坐标位置为100.
·dir==0:往右走;dir==2:往左走,2-0=0,2-2=0;
·往左走一步:1-dir(此时dir==2);
·往右走一步:1-dir(此时dir==0);
·debug的地方:x<0,说明不合法情况;dp[i][x][pos][dir]==1:说明前面已走过,无需重复,且没有必要。
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
string s;
ll n,ans=0;
bool dp[105][55][210][3];
void dfs(ll i,ll x,ll pos,ll dir)
{
if(i==s.size())
{
if(x==0)ans=max(ans,abs(pos-100)*1LL);
return ;
}
if(x<0||dp[i][x][pos][dir]==1)return;
dp[i][x][pos][dir]=1;
if(s[i]=='T')
{
dfs(i+1,x,pos,2-dir);
dfs(i+1,x-1,pos+(1-dir),dir);
}
else
{
dfs(i+1,x,pos+(1-dir),dir);
dfs(i+1,x-1,pos,2-dir);
}
}
void solve()
{
cin>>s>>n;
dfs(0,n,100,0);
cout<<ans;
}
signed main()
{
solve();
return 0;
}