https://www.nowcoder.com/acm/contest/70/E
思路:我dp好菜啊。。 dp[ i ][ j ][ k ][ op ] 表示 到第 i 个字符,用来 j 次操作,能否到达k并朝向op方向。
1 #include<bits/stdc++.h> 2 #define fi first 3 #define se second 4 #define mk make_pair 5 #define pii pair<int,int> 6 #define read(x) scanf("%d",&x) 7 #define sread(x) scanf("%s",x) 8 #define dread(x) scanf("%lf",&x) 9 #define lread(x) scanf("%lld",&x) 10 using namespace std; 11 12 typedef long long ll; 13 const int inf=0x3f3f3f3f; 14 const int INF=0x3f3f3f3f3f3f3f3f; 15 const int N=107; 16 const int M=12; 17 18 int n,m; 19 char s[N]; 20 bool dp[N][51][220][2]; 21 int main() 22 { 23 sread(s+1); read(m); 24 int n=strlen(s+1); 25 26 dp[0][0][105][1]=true; 27 for(int i=1;i<=n;i++) 28 { 29 for(int j=0;j<=m;j++) 30 { 31 for(int k=1;k<=211;k++) 32 { 33 if(s[i]=='F') 34 { 35 if(j) dp[i][j][k][0]|=dp[i-1][j-1][k][1]; 36 if(j) dp[i][j][k][1]|=dp[i-1][j-1][k][1]; 37 38 dp[i][j][k][0]|=dp[i-1][j][k+1][0]; 39 dp[i][j][k][1]|=dp[i-1][j][k-1][1]; 40 } 41 else 42 { 43 if(j) dp[i][j][k][0]|=dp[i-1][j-1][k+1][0]; 44 if(j) dp[i][j][k][1]|=dp[i-1][j-1][k-1][1]; 45 46 dp[i][j][k][0]|=dp[i-1][j][k][1]; 47 dp[i][j][k][1]|=dp[i-1][j][k][0]; 48 } 49 } 50 } 51 } 52 int ans=0; 53 for(int i=1;i<=211;i++) 54 { 55 if(dp[n][m][i][0]) 56 ans=max(ans,abs(i-105)); 57 if(dp[n][m][i][1]) 58 ans=max(ans,abs(i-105)); 59 } 60 printf("%d ",ans); 61 return 0; 62 } 63 /* 64 */