DP简单,输出方案不是十分容易。
一次AC,嘻嘻....
/*
* tyvj-1188
* mike-w
* 2011-11-8
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define SIZE 20
#define INF 9999999
int N;
int f[SIZE][SIZE];
int g[SIZE][SIZE];
int s[SIZE][SIZE];
int q[SIZE];
int num[SIZE];
int L[SIZE],R[SIZE];
int search(int start,int end)
{
int mid=g[start][end];
if(mid==0) return 0;
L[start]++;
R[end]++;
q[++q[0]]=f[start][end]-f[start][mid]-f[mid+1][end];
if(mid+1!=end)
search(mid+1,end);
if(mid!=start)
search(start,mid);
return 0;
}
int main(void)
{
int i,j,k,t;
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
scanf("%d",&N);
for(i=1;i<=N;i++)
scanf("%d",num+i);
for(i=1;i<=N;i++)
for(j=i;j<=N;j++)
s[i][j]=s[i][j-1]+num[j];
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
f[i][j]=INF;
for(i=1;i<=N;i++)
f[i][i]=0;
for(k=2;k<=N;k++) /* step width */
for(i=1;i+k-1<=N;i++) /* starting pos */
for(j=i;j+1<=i+k-1;j++)
{
t=f[i][j]+f[j+1][i+k-1]+s[i][i+k-1];
if(t<=f[i][i+k-1])
{
f[i][i+k-1]=t;
g[i][i+k-1]=j;
}
}
search(1,N);
for(i=1;i<=N;i++)
{
for(j=0;j<L[i];j++)
putchar('(');
printf("%d",num[i]);
for(j=0;j<R[i];j++)
putchar(')');
if(i<N) putchar('+');
}
putchar('\n');
printf("%d\n",f[1][N]);
for(i=q[0];i>=1;i--)
printf("%d ",q[i]);
putchar('\n');
return 0;
}
本文介绍了一个基于动态规划(DP)的算法实现过程,详细展示了如何通过DP解决一个具体的编程问题,并提供了完整的代码示例。文章还介绍了如何输出最优解的具体路径。
359

被折叠的 条评论
为什么被折叠?



