最有价值的会议及memset易错提醒


本文提要:在用malloc开辟空间时,若要用memset清空或者赋初值,不能直接套用memset(P,0,sizeof(p));(p是指针)而应先确定需要的大小n,用memset(p,0,n*sizeof(p));(详细原因可见本下文)

/*动态规划的题目:给定不同会议的时间及其价值(会议时间会有重叠,已按结束时间升序排序),选定总价值之和最高的会议,且同一时间只能进行一场会议*/
#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;
}

猜你喜欢

转载自blog.csdn.net/SWEENEY_HE/article/details/79327109