ダイナミックプランニング-最小コストサブツリー

1225 ワード

原理参照:http://blog.163.com/functioner@126/blog/static/17283815620109304450441/
原文は組合せ部分を列挙するのに少し誤りがあり、f[i,j]=min(f[i,j],f[k][j]+f[i-k][k+j])であるべきである.
               
#include 
#define LEN 100


int main()
{
	int s[LEN][LEN];//      
	int f[LEN][LEN];//     
    int n;
	int i,j,k;
    scanf("%d",&n);
	for(i=1;i<=n;++i)
	{
		scanf("%d",&s[1][i]);
		f[1][i]=s[1][i];
	}
	for(i=1;if[i-1][j+1])
				f[i][j]=f[i-1][j+1];
			else
				f[i][j]=f[i-1][j];
			for(k=2;kf[k][j]+f[i-k][k+j])
				{
				   f[i][j]=f[k][j]+f[i-k][k+j];
				}
			}
           f[i][j]+=s[i][j];
		}
	}
    printf("*****************************
"); for(i=1;i<=n;++i) { for(j=1;j<=n-i+1;j++) { printf("%-3d ",f[i][j]); } printf("
"); } printf("*****************************
"); for(i=1;i<=n;++i) { for(j=1;j<=n-i+1;j++) { printf("%-3d ",s[i][j]); } printf("
"); } return 0; }