zoukankan      html  css  js  c++  java
  • WHU1538 Stones II (dp)

    题意:海滩上有n个石头,每个石头有两个值  a,b ,每取一个石头,所有石头的a值都要减去取的那个石头的b值(不包括已经取到过的了),问你最后你能取到石头a的和的最大值是多少;

    解题思路:1,我们可以知道,在选取同样的石头中,b值小的我们是必需要先取的才能狗得到最大值,所以我们先对石头的b值进行排序,然后再进行dp,dp[i][j]表示 i 之后还有多少个石头要取,如果要取这个时候  得到的值 为  a[i] - j*b[i];

    解题代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 struct node
     5 {
     6     int a,b;
     7     int c;
     8 }a[1010];
     9 int dp[1004][1004];
    10 int cmp(const void * a,const void *b)
    11 {
    12    return (*(node *)a).b - (*(node *)b).b;
    13 }
    14 int main()
    15 {
    16     int n;
    17     while(scanf("%d",&n)!=EOF&&n!=0)
    18     {
    19         memset(a,0,sizeof(a));
    20         for(int i= 1;i<=n;i++)
    21         {
    22             scanf("%d %d",&a[i].a,&a[i].b);
    23         }
    24         memset(dp,0,sizeof(dp));
    25         qsort(a+1,n,sizeof(node),cmp);
    26         for(int i = 1; i <= n ;i ++)
    27         {
    28             
    29             for(int j = 0 ;j <= n;j ++)
    30             {
    31               if(dp[i-1][j] > dp[i-1][j+1] + a[i].a - (j) * a[i].b)   
    32                    dp[i][j] = dp[i-1][j];
    33               else dp[i][j] = dp[i-1][j+1] + a[i].a - (j) * a[i].b;
    34             }
    35         }
    36         printf("%d
    ",dp[n][0]);
    37     }
    38     return 0;
    39 } 
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    测序分析软件-phred的安装
    测序分析软件-trimmomatic的记录
    linux-ubuntu下fastQC的安装及使用
    linux 下统计文本行数
    linux .gz文件 解压缩命令
    启用谷歌浏览器Adobe Flash Player
    「三代组装」使用Pilon对基因组进行polish
    用BUSCO来评估基因组完整性
    linux tar.gz 文件解压缩
    查看jobs详情
  • 原文地址:https://www.cnblogs.com/zyue/p/3637974.html
Copyright © 2011-2022 走看看