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; }