#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define N 3
char *s="abcdabcdabcdabcdabcd";
int L[N]={1,7,9}; //将L中的元素从小到大排序
int calCost(int ss,int se)
{
return se-ss+1;
}
int dp(int ls,int le,int ss,int se,int **B,int **M)
{
if(ls>le || ss>se)
return 0;
if(M[ls][le]>0)
return M[ls][le];
int mincost=INT_MAX;
for(int i=ls;i<=le;i++)
{
int k=L[i];
int c=calCost(ss,se);
int lc=0,rc=0;
lc=dp(ls,i-1,ss,k,B,M);
rc=dp(i+1,le,k+1,se,B,M);
int cost=c+lc+rc;
if(cost<mincost)
{
mincost=cost;
M[ls][le]=cost;
B[ls][le]=i;
}
}
return mincost;
}
void printM(int **M)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
printf("%2d ",M[i][j]);
}
printf("\n");
}
}
void printTrace(int **B,int l,int r)
{
if(l>r)
return;
int k=B[l][r];
if(k==0)
{
printf("%d ",L[k]+1);
printTrace(B,k+1,r);
}
else if(k==N-1)
{
printf("%d ",L[k]+1);
printTrace(B,l,k-1);
}
else
{
printf("%d ",L[k]+1);
printTrace(B,l,k-1);
printTrace(B,k+1,r);
}
}
void main()
{
int **B=(int**)malloc(N*sizeof(int*));
int **M=(int**)malloc(N*sizeof(int*));
for(int i=0;i<N;i++)
{
B[i]=(int*)malloc(N*sizeof(int));
M[i]=(int*)malloc(N*sizeof(int));
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
B[i][j]=-1;
M[i][j]=-1;
}
}
int cost=dp(0,N-1,0,strlen(s)-1,B,M);
printf("%d\n",cost);
//printM(M);
//printM(B);
printTrace(B,0,N-1);
getchar();
}
算法导论 思考题 15-9(字符串拆分)
最新推荐文章于 2022-04-19 15:01:00 发布