本文主要是介绍codeforces 132 C. Logo Turtle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:给一个字符串,‘F’向当前方向走一步,‘T'转方向,改n次,一个符号可以改多次,求走完所有距原点最长距离。
分析:dp[i][j][k][f]表示最长距离,i:第几个字符,j:前i步用改j次,第i步改k次,f:方向。
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<set>
#define inf 10000000
#define pi acos(-1.0)
#define eps 1e-8
#define seed 131
using namespace std;
typedef pair<int,int> pii;
typedef unsigned long long ULL;
typedef long long LL;
const int maxn=100005;
char s[105];
int n;
int dp[105][55][55][2];
int main()
{scanf("%s",s+1);scanf("%d",&n);int len=strlen(s+1);//求正向最大值for(int i=0;i<=len;i++)for(int j=0;j<=n;j++)for(int k=0;k<=j;k++)for(int f=0;f<2;f++)dp[i][j][k][f]=-inf;dp[0][0][0][1]=0;int ans=-inf;for(int i=1;i<=len;i++){for(int j=0;j<=n;j++){for(int k=0;k<=j;k++){for(int f=0;f<2;f++){for(int m=0;m<=j-k;m++){int p;if(s[i]=='T'){if(k%2==0)p=0;elsep=1;}else{if(k%2==0)p=1;elsep=0;}if(p==0){if(f==0)dp[i][j][k][f]=max(dp[i][j][k][f],dp[i-1][j-k][m][1]);elsedp[i][j][k][f]=max(dp[i][j][k][f],dp[i-1][j-k][m][0]);}else{if(f==0)dp[i][j][k][f]=max(dp[i][j][k][f],dp[i-1][j-k][m][0]-1);elsedp[i][j][k][f]=max(dp[i][j][k][f],dp[i-1][j-k][m][1]+1);}}if(i==len&&j==n)ans=max(ans,dp[i][j][k][f]);}}}}//求反向最大值for(int i=0;i<=len;i++)for(int j=0;j<=n;j++)for(int k=0;k<=j;k++)for(int f=0;f<2;f++)dp[i][j][k][f]=inf;dp[0][0][0][1]=0;//int ans=inf;for(int i=1;i<=len;i++){for(int j=0;j<=n;j++){for(int k=0;k<=j;k++){for(int f=0;f<2;f++){for(int m=0;m<=j-k;m++){int p;if(s[i]=='T'){if(k%2==0)p=0;elsep=1;}else{if(k%2==0)p=1;elsep=0;}if(p==0){if(f==0)dp[i][j][k][f]=min(dp[i][j][k][f],dp[i-1][j-k][m][1]);elsedp[i][j][k][f]=min(dp[i][j][k][f],dp[i-1][j-k][m][0]);}else{if(f==0)dp[i][j][k][f]=min(dp[i][j][k][f],dp[i-1][j-k][m][0]-1);elsedp[i][j][k][f]=min(dp[i][j][k][f],dp[i-1][j-k][m][1]+1);}}if(i==len&&j==n)ans=max(ans,-dp[i][j][k][f]);}}}}cout<<ans;return 0;
}
这篇关于codeforces 132 C. Logo Turtle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!