uva 10304 Optimal Binary Search Tree

题意:每个测试数据开始有一个整数n,表示后面有n个数字(代表节点的频率),问建立平衡二叉搜索树的最低代价。代价的计算方法是频率乘以到根节点的路径长。

跑了八秒多。。。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=300;
int a[N],add[N],map[N][N];
bool vis[N][N];
int dp(int,int);
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        memset(map,0,sizeof(map));
        memset(add,0,sizeof(add));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            add[i]=a[i];
            add[i]+=add[i-1];
        }
        printf("%d\n",dp(1,n));
    }
    return 0;
}
int dp(int x,int y)
{
    if(vis[x][y]) return map[x][y];
    else if(x>=y) {vis[x][y]-1;map[x][y]=0;return 0;}
    else
    {
        int imin=1<<30;
        for(int i=x;i<=y;i++)
        {
            imin=min(imin,dp(x,i-1)+dp(i+1,y)+add[y]-add[x-1]-a[i]);
        }
        vis[x][y]=1;
        map[x][y]=imin;
        return imin;
    }
}


你可能感兴趣的:(tree,测试,search)