本文提要:在用malloc开辟空间时,若要用memset清空或者赋初值,不能直接套用memset(P,0,sizeof(p));(p是指针)而应先确定需要的大小n,用memset(p,0,n*sizeof(p));(详细原因可见本下文)
/*动态规划的题目:给定不同会议的时间及其价值(会议时间会有重叠,已按结束时间升序排序),选定总价值之和最高的会议,且同一时间只能进行一场会议*/
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>//前面忘记这个头文件,谢谢提醒@
weixin_40215561
#include<string.h>
#define N 100
struct t
{
int begin;
int end;
int vaule;
} meet[N];
int solve_dp(int n);
int max(int x,int y);
int max(int x,int y)
{
return x>y?x:y;
}
int solve_dp(int n)
{
if(n==1)
return meet[1].vaule;
int i,j;
int *pre=malloc((n+1)*sizeof(int)); //这里的pre与普通的数组不同,而是一个指针,所以sizeof(pre)只有4个字节大
memset(pre,0,(n+1)*sizeof(pre)); //当这里使用memset(pre,0,sizeof(pre));时只有pre[0]被赋值为0,所以还需要乘以长度。
for(i=2; i<=n; i++)
for(j=i-1; j>=1; j--)
if(meet[i].begin>=meet[j].end)
{
pre[i]=j;
break;
}
int *opt = malloc((n+1)*sizeof(int));
opt[1] = meet[1].vaule;
for(i = 2; i<=n; i++)
{
if(pre[i]==0)
opt[i]=max(meet[i].vaule,opt[i-1]);//当pre[i]=0时说明若选择当前会议则前面没有可选的会议
else
opt[i] = max((meet[i].vaule+opt[pre[i]]),opt[i-1]);
}
return opt[n];
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d%d%d",&meet[i].begin,&meet[i].end,&meet[i].vaule);
printf("%d",solve_dp(n));
return 0;
}
#include<string.h>
#define N 100
struct t
{
int begin;
int end;
int vaule;
} meet[N];
int solve_dp(int n);
int max(int x,int y);
int max(int x,int y)
{
return x>y?x:y;
}
int solve_dp(int n)
{
if(n==1)
return meet[1].vaule;
int i,j;
int *pre=malloc((n+1)*sizeof(int)); //这里的pre与普通的数组不同,而是一个指针,所以sizeof(pre)只有4个字节大
memset(pre,0,(n+1)*sizeof(pre)); //当这里使用memset(pre,0,sizeof(pre));时只有pre[0]被赋值为0,所以还需要乘以长度。
for(i=2; i<=n; i++)
for(j=i-1; j>=1; j--)
if(meet[i].begin>=meet[j].end)
{
pre[i]=j;
break;
}
int *opt = malloc((n+1)*sizeof(int));
opt[1] = meet[1].vaule;
for(i = 2; i<=n; i++)
{
if(pre[i]==0)
opt[i]=max(meet[i].vaule,opt[i-1]);//当pre[i]=0时说明若选择当前会议则前面没有可选的会议
else
opt[i] = max((meet[i].vaule+opt[pre[i]]),opt[i-1]);
}
return opt[n];
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d%d%d",&meet[i].begin,&meet[i].end,&meet[i].vaule);
printf("%d",solve_dp(n));
return 0;
}