今天开始进行日常的博客更新。
做的第一道区间dp题,思路是找一个可以递推的状态,这道题我重点思考了对于 ” ()() ” 和 ” ( ( ) )” 这两种形式的括号匹配的递推,于是发现新状态的递推有两种,dp[l][r] = dp[l+1][r-1] + 2 和 dp[l][r] = dp[l][k] + dp[k+1][r],于是此题可做。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int check(char a,char b)
{
if(a=='(' && b==')')
return 1;
if(a=='[' && b==']')
return 1;
return 0;
}
int main()
{
char str[105];
int dp[105][105],i,j,k,len;
while(~scanf("%s",str))
{
if(!strcmp(str,"end"))
break;
len = strlen(str);
for(i = 0; i<len; i++)
{
dp[i][i] = 0;
if(check(str[i],str[i+1]))
dp[i][i+1] = 2;
else
dp[i][i+1] = 0;
}
for(k = 3; k<=len; k++)
{
for(i = 0; i+k-1<len; i++)
{
dp[i][i+k-1] = 0;
if(check(str[i],str[i+k-1]))
dp[i][i+k-1] = dp[i+1][i+k-2]+2;
for(j = i; j<i+k-1; j++)
dp[i][i+k-1] = max(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]);
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}