zoukankan      html  css  js  c++  java
  • dp——[Usaco2007 Nov]Milking Time

    解题的思想用到了 类似最长递增子序的方法,先按起始时间升序排序,不断更新,到某点(包括改点)最大值
    排序的目的:可以把看似二维的区间降到一维!!!!
    O(n*n)
    dp[i]=max(dp[i],dp[j]+node[i].v);
    dp[i]放着的是包括i点,最大的价值
    View Code
    #include<stdio.h>
    #include
    <iostream>
    #include
    <algorithm>
    #include
    <string.h>
    using namespace std;

    struct data
    {
    int b,e;
    int v;
    }node[
    1009];

    int dp[1009];

    bool cmp(data a,data b)
    {
    if(a.b==b.b)
    return a.e<b.e;
    else
    return a.b<b.b;
    }


    int main()
    {
    int n,time;
    while(scanf("%*d%d%d",&n,&time)!=EOF)
    {
    int i,j;
    memset(dp,
    0,sizeof(dp));
    for(i=0;i<n;i++)
    {
    scanf(
    "%d%d%d",&node[i].b,&node[i].e,&node[i].v);
    node[i].e
    +=time;

    }
    sort(
    &node[0],&node[n],cmp);
    for(i=0;i<n;i++)
    {
    dp[i]
    =node[i].v;
    }

    for(i=1;i<n;i++)
    {
    for(j=0;j<i;j++)
    {
    if(node[i].b>=node[j].e)
    {
    if(dp[i]<dp[j]+node[i].v)
    {
    dp[i]
    =dp[j]+node[i].v;
    }
    }
    }
    }

    int max=0;
    for(i=0;i<n;i++)
    {
    if(max<dp[i])max=dp[i];
    }

    printf(
    "%d\n",max);
    }
    }

      

  • 相关阅读:
    缺少一个=出现的问题
    快速排序+归并排序
    ACwing简单题(14)
    浅谈#ifndef
    fstream 使用详解
    _stat函数的使用
    关于文件结构体的使用
    new的使用
    ACwing13题目
    ACwing13题
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2117924.html
Copyright © 2011-2022 走看看