POJ2955Brackets——dp
题目:http://poj.org/problem?id=2955
1.考虑区间。
2.当前区间可为自己子区间的和(题意果然是和而非最大值)。
3.考虑当前区间的边界。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int d[105][105],len; bool v[105][105]; char s[105]; void dfs(int i,int j) { if(v[i][j])return; v[i][j]=1; if(i==j)return; if(i+1==j) { if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) d[i][j]=2; return; } for(int k=i;k<j;k++) { dfs(i,k);dfs(k+1,j); d[i][j]=max(d[i][j],d[i][k]+d[k+1][j]); } if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) { dfs(i+1,j-1); d[i][j]=max(d[i][j],d[i+1][j-1]+2); } } int main() { while(1) { gets(s); if(s[0]=='e')return 0; len=strlen(s); dfs(0,len-1); printf("%d\n",d[0][len-1]); memset(v,0,sizeof v); memset(d,0,sizeof d); } }