UVA 10304 Optimal Binary Search Tree

大意略。

思路:参见《算法导论》P215.

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

const int MAXN = 260;
const int INF = 0x3f3f3f3f;

int n;

int d[MAXN][MAXN];
bool vis[MAXN][MAXN];
int sum[MAXN];
int p[MAXN];

void init()
{
	memset(sum, 0, sizeof(sum));
	memset(vis, 0, sizeof(vis));
}

/*int sum(int i, int j)
{
	int s = 0;
	for(int k = i; k <= j; k++) s += p[k];
	return s;
}*/

int dp(int i, int j)
{
	int &ans = d[i][j];
	if(vis[i][j]) return ans;
	vis[i][j] = 1;
	ans = INF;
	if(i >= j) ans = 0;
	else
	{
		for(int r = i; r <= j; r++)
		{
			int w = sum[j] - sum[i-1] - p[r];
			ans = min(ans, dp(i, r-1) + dp(r+1, j) + w);
		}
	}
	return ans;
}

void read_case()
{
	init();
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &p[i]);
		sum[i] = sum[i-1] + p[i];
	}
}

void solve()
{
	read_case();
	int ans = dp(1, n);
	printf("%d\n", ans);
}

int main()
{
	while(~scanf("%d", &n))
	{
		solve();
	}
	return 0;
}


你可能感兴趣的:(UVA 10304 Optimal Binary Search Tree)