题意:
现在我们定义一种R串,它必须满足以下条件:
1)当它的字串是空的时候时,那么它是R串。
2)当它是R串时,那么(s)或是[s]也是R串。
3)当a和b都是R串时,那么ab也是R串。
这里我没有完全领悟题目的意思,所以我发现递推不过去。其实它的实质就是括号匹配。
也就是说这里的合法序列是指括号能够两两匹配的。
if((a[s]==‘(‘&&a[e]==‘)‘)||(a[s]==‘[‘&&a[e]==‘]‘))
这里的这种情况时当外围是相互匹配的时候。
dp[s][e]=dp[s+1][e-1]+2;
当外围不匹配的时候,那么我们就要枚举分割点了。这里的就和区间dp没有多大区别了。
#include<stdio.h> #include<string.h> #include<map> #include<set> #include<queue> #include<stack> #include<math.h> #include<iostream> #include<algorithm> using namespace std; #define maxn 111 char a[maxn]; int dp[maxn][maxn]; int main(){ while(~scanf("%s",a)){ if(strcmp(a,"end")==0) break; memset(dp,0,sizeof(dp)); int l=strlen(a); for(int len=2;len<=l;len++){ for(int s=0;s<=l-len;s++){ int e=s+len-1; if((a[s]=='('&&a[e]==')')||(a[s]=='['&&a[e]==']')) dp[s][e]=dp[s+1][e-1]+2; for(int k=s;k<e;k++){ dp[s][e]=max(dp[s][e],dp[s][k]+dp[k+1][e]); } } } int ans=0; for(int i=0;i<l;i++){ for(int j=0;j<l;j++){ ans=max(ans,dp[i][j]); } } printf("%d\n",ans); } }
希望思维能够更加进步,加油加油加油!
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-06 21:48:08