#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define N 11
typedef 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;
else
return 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();
}
算法导论 活动选择问题(动态规划方法)
最新推荐文章于 2022-12-04 08:03:00 发布