标签:style color os io for ar 问题 log amp
给出一串由FT构成的串,F代表前进,T代表转向,初始方向是1,转向后F由1变为-1(或者-1变成1)
例如FTFFFTFFFFF值为3
给出n,必须做n次操作(让F变为T或者让T变成F),求最远能离原来的地方前进多远(绝对值)
可以搜索来解决这个问题
对每次行程,我们可以选择
继续按当前方向走
或者改变方向
那么,粗略估算一下,字符串最长为100,那么就是2^100,复杂度过高
但是对于四个变量来说
当前方向,当前走了多远,在第几个行程,剩余操作数目
接下来所能走的的最远距离是确定的
那么可以记忆化搜索
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> using namespace std; char str[111]; int dp[2][222][111][55]; int m; int dfs(int dir,int pos,int i,int left){ if(!str[i] && left) return 0;//行程完了操作数没用完不算,return 0 if(dp[dir][pos+100][i][left]!=-1) return dp[dir][pos+100][i][left]; if(!str[i] && !left) return dp[dir][pos+100][i][left]=abs(pos);//行程完了且操作数完了 则return pos int mv=(dir==1)?1:-1; if(left==0) dp[dir][pos+100][i][left]=dfs(dir,pos+mv,i+1,left-(str[i]!='F'));//否则就继续按照当前方向走 return dp[dir][pos+100][i][left]=max(dfs(dir,pos+mv,i+1,left-(str[i]!='F')),dfs(!dir,pos,i+1,left-(str[i]!='T'))); } int main(){ #ifndef ONLINE_JUDGE freopen("/home/rainto96/in.txt","r",stdin); #endif memset(dp,-1,sizeof(dp)); cin>>str>>m; int ans=0; for(int mm=m;mm>=0;mm-=2){ ans=max(ans,dfs(1,0,0,mm)); ///cout<<"a::"<<ans<<endl; ///cout<<mm<<endl; } cout<<ans<<endl; return 0; }
标签:style color os io for ar 问题 log amp
原文地址:http://blog.csdn.net/u011775691/article/details/38823525