网站地图    收藏   

主页 > 前端 > css教程 >

rnqoj-49-加分二叉树-(区域动归+记忆化) - html/

来源:自学PHP网    时间:2015-04-14 14:51 作者: 阅读:

[导读] 区域动归的问题 includestdio h includestring h includeiostream includealgorithm using namespace std; int n; int a[51]; int vis[51][51]; int num[51][51];...

区域动归的问题
 
#include<stdio.h>  
#include<string.h>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
int n;  
int a[51];  
int vis[51][51];  
int num[51][51];  
int dll(int l,int r)  
{  
    int i;  
    if(num[l][r]!=-1)return num[l][r];  
    if(l>r)  
    {  
        return 1;  
    }  
    if(l==r)  
    {  
        num[l][r]=a[l];  
        vis[l][r]=l;  
        return a[l];  
    }  
    int as=0;  
    for(i=l;i<=r;i++)  
    {  
        int t=0;  
        t=dll(l,i-1)*dll(i+1,r)+a[i];  
        if(as<t)  
        {  
            vis[l][r]=i;  
            as=t;  
        }  
    }  
    num[l][r]=as;  
    return as;  
}  
int leap;  
void dos(int l,int r)  
{  
    if(vis[l][r]==-1)return ;  
    if(leap==0)  
    {  
        printf("%d",vis[l][r]);  
    }  
    else  
    {  
        printf(" %d",vis[l][r]);  
    }  
    leap++;  
    if(l<r)  
    {  
        dos(l,vis[l][r]-1);  
        dos(vis[l][r]+1,r);  
    }  
}  
int main()  
{  
    int i;  
    while(~scanf("%d",&n))  
    {  
        memset(num,-1,sizeof(num));  
        memset(vis,-1,sizeof(vis));  
        for(i=1;i<=n;i++)scanf("%d",&a[i]);  
        if(dll(1,n));  
        cout<<num[1][n]<<endl;  
        leap=0;  
        dos(1,n);  
        cout<<endl;  
    }  
}  

 

 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论