您的位置:首页 > 大数据 > 人工智能

【codechef】Chef and Bracket-Pairs (分层dp)

2015-06-19 15:19 357 查看


Input:
11
-1 -2 9 2 -3 -4 3 4 8 8 1 

Output:
12

http://www.codechef.com/problems/CHEFBR/

#include<iostream>  
#include<algorithm>  
#include<string>  
#include<map>  
#include<set>  
#include<cmath>  
#include<vector>
#include<queue>
#include<string.h>  
#include<stdlib.h>  
#include<cstdio>  
#define ll long long  
#define mod 1000000007
using namespace std; 
int x[101];
ll dp[101][101];  //dp[j][i]表示j到i有多少个平衡子序列 
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>x[i];
	}
	for(int i=0;i<101;++i)
		for(int j=0;j<101;++j) //初始化(1代表空串) 
			dp[i][j]=1;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=i;++j)
			dp[j][i]=dp[j][i-1];  //先继承 
		if(x[i]>0){  //为了不算多,只取右括号的情况 
			for(int j=i-1;j>=1;--j){  //j为k到i的中间位置 
				if(x[j]+x[i]==0){     //匹配 
					for(int k=j;k>=1;--k)
						dp[k][i]=(dp[k][i]+(dp[k][j-1]*dp[j+1][i-1])%mod)%mod;
						//把k到i去除掉j位置和i位置后剩余的两段平衡序列个数相乘 
				}
			}
		}
	}
	cout<<dp[1]
<<endl;
    return 0;     
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: