zoukankan      html  css  js  c++  java
  • BZOJ 1270 雷涛的小猫 dp

    题目链接:

    https://www.lydsy.com/JudgeOnline/problem.php?id=1270

    题目大意:

    雷涛的小猫雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学生宿舍管理条例的)。  在他的照顾下,小猫很快恢复了健康,并且愈发的活泼可爱了。可是有一天,雷涛下课回到寝室,却发现小猫不见了!经过一番寻找,才发现她正趴在阳台上对窗外的柿子树发呆…在北京大学的校园里,有许多柿子树,在雷涛所在的宿舍楼前,就有N棵。并且这N棵柿子树每棵的高度都是H。冬天的寒冷渐渐笼罩了大地,树上的叶子渐渐掉光了,只剩下一个个黄澄澄的柿子,看着非常喜人。而雷涛的小猫恰好非常的爱吃柿子,看着窗外树上的柿子,她十分眼馋,于是决定利用自己敏捷的跳跃能力跳到树上去吃柿子。小猫可以从宿舍的阳台上跳到窗外任意一棵柿子树的树顶。之后,她每次都可以在当前位置沿着当前所在的柿子树向下跳1单位距离。当然,小猫的能力远不止如此,她还可以在树之间跳跃。每次她都可以从当前这棵树跳到另外的任意一棵,在这个过程中,她的高度会下降Delta单位距离。每个时刻,只要她所在的位置有柿子,她就可以吃掉。整个“吃柿子行动”一直到小猫落到地面上为止。雷涛调查了所有柿子树上柿子的生长情况。饱很想知道,小猫从阳台出发,最多能吃到多少柿子?他知道写一个程序可以很容易的解决这个问题,但是他现在懒于写任何代码。于是,现在你的任务就是帮助雷涛写一个这样的程序。左图是N=3,H=10,Delta=2的一个例子。小猫按照图示路线进行跳跃,可以吃到最多的8个柿子

    思路:

    直接进行dp。dp[i][j]表示第i棵树高度j的得到柿子的最大值。

    dp[i][j] = max(dp[i][j + 1] , max{dp[k][i + delta] | k = 1...n})+ num[i][j]

    时间复杂度O(n^3),会超时

    在更新解的时候存下每一高度的最大值,那么max{dp[k][i + delta] | k = 1...n}可以直接得到。

    时间复杂度O(n^2),可以接受。

     1 #include<bits/stdc++.h>
     2 #define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
     3 #define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时
     4 #define Min(a, b) ((a) < (b) ? (a) : (b))
     5 #define Mem(a) memset(a, 0, sizeof(a))
     6 #define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
     7 #define MID(l, r) ((l) + ((r) - (l)) / 2)
     8 #define lson ((o)<<1)
     9 #define rson ((o)<<1|1)
    10 #define Accepted 0
    11 #pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
    12 using namespace std;
    13 inline int read()
    14 {
    15     int x=0,f=1;char ch=getchar();
    16     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    17     while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    18     return x*f;
    19 }
    20 
    21 typedef long long ll;
    22 const int maxn = 2000 + 10;
    23 const int MOD = 1000000007;//const引用更快,宏定义也更快
    24 const int INF = 1e9 + 7;
    25 const double eps = 1e-6;
    26 
    27 int dp[maxn][maxn];
    28 int num[maxn][maxn];//柿子数量
    29 int Max[maxn];//每一高度的最大值
    30 
    31 int main()
    32 {
    33     int n, h, delta;
    34     scanf("%d%d%d", &n, &h, &delta);
    35     for(int i = 1; i <= n; i++)
    36     {
    37         int m, x;
    38         scanf("%d", &m);
    39         while(m--)
    40         {
    41             scanf("%d", &x);
    42             num[i][x]++;
    43         }
    44     }
    45     for(int i = 1; i<= n; i++)dp[i][h] = num[i][h], Max[h] = max(Max[h], dp[i][h]);
    46     for(int i = h - 1; i >= 1; i--)
    47     {
    48         for(int j = 1; j <= n; j++)
    49         {
    50             dp[j][i] = dp[j][i + 1] + num[j][i];
    51             if(i + delta <= h)dp[j][i] = max(dp[j][i], Max[i + delta] + num[j][i]);
    52             Max[i] = max(Max[i], dp[j][i]);
    53         }
    54     }
    55     printf("%d
    ", Max[1]);
    56     return Accepted;
    57 }
  • 相关阅读:
    pip不是内部或外部命令也不是可运行的程序或批处理文件的问题
    动态规划 leetcode 343,279,91 & 639. Decode Ways,62,63,198
    动态规划 70.climbing Stairs ,120,64
    (双指针+链表) leetcode 19. Remove Nth Node from End of List,61. Rotate List,143. Reorder List,234. Palindrome Linked List
    建立链表的虚拟头结点 203 Remove Linked List Element,82,147,148,237
    链表 206 Reverse Linked List, 92,86, 328, 2, 445
    (数组,哈希表) 219.Contains Duplicate(2),217 Contain Duplicate, 220(3)
    重装系统
    java常用IO
    端口
  • 原文地址:https://www.cnblogs.com/fzl194/p/9682331.html
Copyright © 2011-2022 走看看