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