TYVJ 1073 加分二叉树 解题报告

  DP,最近做TYVJ感觉挺有效果的,比较难得先跳过,前期先练手感,把手感练好了,再慢慢提升难度。

  题目比较简单,调试了好一阵,提交了几次,羞愧。。代码:

#include <stdio.h>
#include <stdlib.h>
unsigned num[30], f[30][30];
int p[30][30];

unsigned ans(int s, int t)
{
	int i;
	unsigned a = 0, b;
	if(s == t){
		return num[s];
	}
	if(s > t){
		return 1;
	}
	if(f[s][t]){
		return f[s][t];
	}
	for(i = s; i <= t; i++){
		b = ans(s, i - 1) * ans(i + 1, t) + num[i];
		if(a < b){
			p[s][t] = i;
			a = b;
		}
	}
	f[s][t] = a;
	return a;
}

void output(int s, int t, int k)
{
	if(s == t){
		printf(" %d", t + 1);
		return;
	}
	if(s > t){
		return;
	}
	if(k){
		printf(" ");
	}
	printf("%d", p[s][t] + 1);
	output(s, p[s][t] - 1, 1);
	output(p[s][t] + 1, t, 1);
}

int main(int argc, char **argv)
{
	int i;
	int n;
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &num[i]);
	}
	printf("%u\n", ans(0, n - 1));
	output(0, n - 1, 0);
	printf("\n");
	return 0;
}

posted @ 2011-07-06 11:35  zqynux  阅读(309)  评论(0编辑  收藏  举报