zoukankan      html  css  js  c++  java
  • Hdu 4293 DP

    题意:

    n个人说自己前面有多少人 后面有多少人

    求出说真话人数最多的情况 

    每个样例有 一个 n 表示n个人

    接下来 n 行有a b 表示他前面的人数和后面的人数

     

    思路:

    如果已经知道了其中一组的人数~

    就往前找..找在这一组之前与这一组的话不矛盾的最多人数

     

    Tips:

    用dp[ i ][ j ] 表示从第 i+1 个人到第 j 个人为一组的时候前j个人中说真话最多的人

    用tt[ i ][ j ] 表示从第 i 个人到第 j 个人之间站了多少人

    用an[ i ]表示到第 i 个人前面说真话的人最多人数

     

    tt[ a ][ b ]的人数不应该多于 n-(b-a+1) 

    Code:

    View Code
     1 #include <stdio.h>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 int dp[510][510];    
     7 int tt[510][510], an[510];
     8 
     9 int main()
    10 {
    11     int i, j, k;
    12     int n, a, b;
    13     while(scanf("%d", &n) != EOF)
    14     {
    15         memset(dp, 0, sizeof(dp));
    16         memset(an, 0, sizeof(an));
    17         memset(tt, 0, sizeof(tt));
    18 
    19         for(i = 0; i < n; ++i) {
    20             scanf("%d %d", &a, &b);
    21             if(a+b < n && tt[a][n-b] < (n-a-b))
    22                 tt[a][n-b]++;
    23         }
    24 
    25         for(i = 1; i <= n; ++i)
    26         for(j = 0; j < i; ++j) {
    27             dp[j][i] = an[j]+tt[j][i];
    28             an[i] = max(an[i], dp[j][i]);
    29         }
    30 
    31         printf("%d\n", an[n]);
    32     }
    33     return 0;
    34 }

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4293

  • 相关阅读:
    方法的调用机制
    类的成员之二:方法
    类的成员之一:属性
    关键字static
    构造器
    this关键字
    递归方法(recursion)
    方法重载(二)
    GTID 跳过脚本
    mydumper 找不到libmysqlclient.so.20
  • 原文地址:https://www.cnblogs.com/Griselda/p/2692393.html
Copyright © 2011-2022 走看看