| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:我用纯dp过了,但是用备忘录却过不了,请高人看看程序In Reply To:我用纯dp过了,但是用备忘录却过不了,请高人看看程序 Posted by:newbee007 at 2009-08-22 21:00:35 > #include<iostream>
> #include<string>
> using namespace std;
> #define M 105
>
> int state[M][M]; //表示第i个括号到j个括号,配对之后的括号数
> string ans[M][M]; //表示第i个括号到j个括号,配对之后的符号串
> char str[M];
> int n;
>
> bool Match(char x,char y)
> {
> if(x=='('&&y==')')
> return true;
> if(x=='['&&y==']')
> return true;
> return false;
> }
>
> void Init()
> {
> int i,j;
> for(i=0;i<=n;i++)
> for(j=0;j<=n;j++)
> {
> state[i][j]=0;
> ans[i][j]="";
> }
> for(i=1;i<=n;i++)
> {
> state[i][i]=2;
> if(str[i]=='('||str[i]==')')
> ans[i][i]="()";
> else
> ans[i][i]="[]";
> }
> }
> int DP(int i,int j){
> int k;
> if(state[i][j])
> return state[i][j];
加上这一句:if(i>j)return 0 ;
> int dist=99999;
> for(k=i;k<j;k++)
> {
> if(dist>DP(i,k)+DP(k+1,j))
> {
> dist=DP(i,k)+DP(k+1,j);
> ans[i][j]=ans[i][k]+ans[k+1][j];
> }
> if(Match(str[i],str[j]))
> {
> if(dist>DP(i+1,j-1)+2)
> {
> dist=state[i+1][j-1]+2;
> ans[i][j]=str[i]+ans[i+1][j-1]+str[j];
> }
> }
> }
> state[i][j]=dist;
> return dist;
> }
> int main()
> {
> cin>>str+1;
> n=strlen(str+1);
> Init();
> DP(1,n);
> cout<<ans[1][n]<<endl;
> return 0;
> }
AC了,因为前面没有处理好DP(i,j) i>j的情况
加了一句 if(i>j)return 0 就过了
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator