1. 程式人生 > >BZOJ1270: [BeijingWc2008]雷濤的小貓

BZOJ1270: [BeijingWc2008]雷濤的小貓

自己 src desc 整數 spa 地面 com mem 都是

Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 1475 Solved: 813
[Submit][Status][Discuss]

Description

雷濤的小貓雷濤同學非常的有愛心,在他的宿舍裏,養著一只因為受傷被救助的小貓(當然,這樣的行為是違反學 生宿舍管理條例的)。 在他的照顧下,小貓很快恢復了健康,並且愈發的活潑可愛了。可是有一天,雷濤下課回 到寢室,卻發現小貓不見了!經過一番尋找,才發現她正趴在陽臺上對窗外的柿子樹發呆…在北京大學的校園裏, 有許多柿子樹,在雷濤所在的宿舍樓前,就有N棵。並且這N棵柿子樹每棵的高度都是H。冬天的寒冷漸漸籠罩了大 地,樹上的葉子漸漸掉光了,只剩下一個個黃澄澄的柿子,看著非常喜人。而雷濤的小貓恰好非常的愛吃柿子,看 著窗外樹上的柿子,她十分眼饞,於是決定利用自己敏捷的跳躍能力跳到樹上去吃柿子。小貓可以從宿舍的陽臺上 跳到窗外任意一棵柿子樹的樹頂。之後,她每次都可以在當前位置沿著當前所在的柿子樹向下跳1單位距離。當然 ,小貓的能力遠不止如此,她還可以在樹之間跳躍。每次她都可以從當前這棵樹跳到另外的任意一棵,在這個過程 中,她的高度會下降Delta單位距離。每個時刻,只要她所在的位置有柿子,她就可以吃掉。整個“吃柿子行動” 一直到小貓落到地面上為止。雷濤調查了所有柿子樹上柿子的生長情況。飽很想知道,小貓從陽臺出發,最多能吃 到多少柿子?他知道寫一個程序可以很容易的解決這個問題,但是他現在懶於寫任何代碼。於是,現在你的任務就 是幫助雷濤寫一個這樣的程序。左圖是N=3,H=10,Delta=2的一個例子。小貓按照圖示路線進行跳躍,可以吃到最 多的8個柿子 技術分享圖片

Input

第一行三個整數N,H,Delta 接下來N行,每行一個整數Ni代表第i個樹上柱子的數量 接下來Ni個整數,每個整數Tij代表第i個樹的高度Tij上有一個柿子 1<=N,H<=2000 0<=Ni<=5000 1<=Delta<=N 1<=Ti<=H 輸入文件不大於40960Kb

Output

小貓能吃到多少柿子

Sample Input

3 10 2
3 1 4 10
6 3 5 9 7 8 9
5 4 5 3 6 9

Sample Output

8

f[j][i]表示第j顆樹高度i所能摘到的柿子數,mn[i]表示高度i時所能摘到的最多的柿子數(用於不同樹之間的跳躍)

#include <bits/stdc++.h>
using namespace std;
int f[2005];
int cnt[2005][2005],mn[4005];
int n,h,del;
int main(){
    scanf("%d%d%d",&n,&h,&del);
    memset(f,0,sizeof(f));
    memset(cnt,0,sizeof(cnt));
    memset(mn,0,sizeof(mn));
    for (int k = 1;k <= n;++k){
        int
tmp; scanf("%d",&tmp); for (int i = 0;i < tmp;++i){ int high; scanf("%d",&high); cnt[k][high]++; } } for (int i = h;i >= 0;--i){ for (int j = 1;j <= n;++j){ f[j] = max(cnt[j][i] + mn[i+del],cnt[j][i] + f[j]); mn[i] = max(mn[i],f[j]); } } printf("%d\n",mn[0]); return 0; }

BZOJ1270: [BeijingWc2008]雷濤的小貓