TopCoder SRM 348 Div1 Easy LostParentheses

問題

数字および+,-からなる式が与えられる。
この式に括弧を適切に挿入し、式の値が最も小さくなるようにしたい。


式の値の最小値はいくつか、求めよ。

制約条件

式は50文字以下
出てくる数字は5桁以下

方針

動的計画法による。
i番目からj番目の項に適当に括弧を挿入したときにできる値の最大値をmn[i][j]
最大値をmx[i][j]として、これを更新していくようなDPをすればよい。

ソースコード

int n,num[50],sig[50];
int mn[60][60],mx[60][60];

class LostParentheses {
	public:
	int minResult(string e) 
	{
		n=1;
		rep(i,e.size())if(e[i]=='+'||e[i]=='-'){
			sig[n++]=e[i]=='+'?1:-1;
			e[i]=' ';
		}
		stringstream ss(e);
		n=0;
		while(ss>>num[n])n++;
		rep(i,n)rep(j,n){
			mn[i][j]=i!=j?inf:num[i];
			mx[i][j]=i!=j?-inf:num[i];
		}
		for(int l=2;l<=n;l++)rep(i,n-l+1){
			for(int m=i;m<i+l-1;m++){
				int a=mn[i][m]+mn[m+1][i+l-1]*sig[m+1], b=mn[i][m]+mx[m+1][i+l-1]*sig[m+1];
				int c=mx[i][m]+mn[m+1][i+l-1]*sig[m+1], d=mx[i][m]+mx[m+1][i+l-1]*sig[m+1];
				mn[i][i+l-1]=min(mn[i][i+l-1],min(min(a,b),min(c,d)));
				mx[i][i+l-1]=max(mx[i][i+l-1],max(max(a,b),max(c,d)));
			}
		}
		return mn[0][n-1];
	}
};