算法导论 思考题 15-9(字符串拆分)

#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();  
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值