tyvj-1188 添加括号 DP 输出方案

来源:互联网 发布:淘宝线下实体店 编辑:程序博客网 时间:2024/06/04 23:35

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 9999999int 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_JUDGEfreopen("in","r",stdin);#endifscanf("%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;}


原创粉丝点击