算法导论 活动选择问题(动态规划方法)

来源:互联网 发布:淘宝数据作假 编辑:程序博客网 时间:2024/06/04 23:36
#include <stdio.h>#include <stdlib.h>#include <limits.h>#define N 11typedef struct ActNode{int start;int end;}Act,*pAct;bool intersect(int i,int j,Act a){if(a.start>=i && a.end<=j)return true;elsereturn false;}void dp(int **DP,int dpl,pAct ac,int len,int **Trace){for(int l=1;l<dpl;l++){for(int i=1;i<dpl-l+1;i++){int j=i+l-1,temp=0,max=0,maxK=-1;for(int k=0;k<len;k++){if(intersect(i,j,ac[k])){temp=DP[i][ac[k].start]+DP[ac[k].end][j]+1;}if(temp>max){max=temp;maxK=k;}}DP[i][j]=max;Trace[i][j]=maxK;}}}pAct initActs(){pAct acts=(pAct)malloc(N*sizeof(Act));acts[0].start=1;acts[0].end=4;acts[1].start=3;acts[1].end=5;acts[2].start=0;acts[2].end=6;acts[3].start=5;acts[3].end=7;acts[4].start=3;acts[4].end=9;acts[5].start=5;acts[5].end=9;acts[6].start=6;acts[6].end=10;acts[7].start=8;acts[7].end=11;acts[8].start=8;acts[8].end=12;acts[9].start=2;acts[9].end=14;acts[10].start=12;acts[10].end=16;return acts;}void initDP(int **DP,int **Trace,int len){for(int i=0;i<len;i++){for(int j=0;j<len;j++){DP[i][j]=0;Trace[i][j]=-1;}}}void printDP(int **DP,int len){for(int i=1;i<len;i++){for(int j=1;j<len;j++){printf("%2d ",DP[i][j]);}printf("\n");}}void printTrace(int **Trace,int i,int j,int len,pAct acts){if(i<0 || i>=len || j<0 || j>=len)return;int k=Trace[i][j];if(k>=0){printf("a[%d] ",k+1);printTrace(Trace,i,acts[k].start,len,acts);printTrace(Trace,acts[k].end,j,len,acts);}}void main(){pAct acts=initActs();int len=acts[N-1].end+1;int **DP=(int**)malloc(len*sizeof(int*));int **Trace=(int**)malloc(len*sizeof(int*));for(int i=0;i<len;i++){DP[i]=(int*)malloc(len*sizeof(int));Trace[i]=(int*)malloc(len*sizeof(int));}initDP(DP,Trace,len);dp(DP,len,acts,N,Trace);//printDP(DP,len);//printDP(Trace,len);printf("最多%d个活动\n",DP[1][len-1]);printTrace(Trace,1,len-1,len,acts);getchar();}

阅读全文
0 0