求区间 DP,
这个题写了两个程序,
两个程序的 DP 方程是一样的,但是 循环是不一样的,
发现一了一个规律,如果我们最后想要输出 f[0][n],
那么我们需要最后更新 1,n。
不然可能会错过最优解。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define mem(x,v) memset(x,v,sizeof(x))
int f[200][200];
int main(){
char s[200];
int len;
while(cin>>s){
if (s[0] == 'e') break;
mem(f,0);
len = strlen(s);
for (int i = len - 1; i >= 0; i--) // i 从后往前 --
for (int j = i+1; j < len; j++){
if ((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))
f[i][j] = max(f[i][j], f[i+1][j-1] + 2);
for (int k = i; k <= j; k++)
f[i][j] = max(f[i][j],f[i][k]+f[k+1][j]);
}
printf("%d\n",f[0][len-1]);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define mem(x,v) memset(x,v,sizeof(x))
int f[200][200];
int main(){
char s[200];
int len;
while(cin>>s){
if (s[0] == 'e') break;
mem(f,0);
len = strlen(s);
for (int j = 1; j < len; j++) //j 从前往后,++
for (int i = j - 1; i >= 0; i--){
if ((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))
f[i][j] = max(f[i][j], f[i+1][j-1] + 2);
for (int k = i; k <= j; k++)
f[i][j] = max(f[i][j],f[i][k]+f[k+1][j]);
}
printf("%d\n",f[0][len-1]);
}
return 0;
}