POJ 2955-Brackets (括号匹配,。。经典区间DP)

求区间 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;
}

猜你喜欢

转载自blog.csdn.net/kidsummer/article/details/81346279