SDAU dp专题 1007

来源:互联网 发布:asp.net连接数据库 编辑:程序博客网 时间:2024/05/19 14:39

1:问题描述
Problem Description
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标:


为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)

Input
输入数据有多组。每组数据的第一行为以正整数n (0 < n<100000),表示有n个馅饼掉在这条小径上。在结下来的n行中,每行有两个整数x,T(0 < T < 100000),表示在第T秒有一个馅饼掉在x点上。同一秒钟在同一点上可能掉下多个馅饼。n=0时输入结束。

Output
每一组输入数据对应一行输出。输出一个整数m,表示gameboy最多可能接到m个馅饼。
提示:本题的输入数据量比较大,建议用scanf读入,用cin可能会超时。

Sample Input
6
5 1
4 1
6 1
7 2
7 2
8 3
0

Sample Output
4

2:大致题意

中文题,不翻译~

3:思路

也是一个三角模型。
稍微转化一下。从下向上遍历。
建立一个树,行代表秒数,列代表位置。
用一个2维数组来表示,ww【i】【j】代表第i个位置,第j秒掉的馅饼数。套三角模型的模板就好啦,那个题理解了这个题就简单了~

4:感想

刚刚一个舍友说了一句话雷到我了:自古真情留不住,从来套路得人心。
好有哲理。哈哈。

5:ac代码

#include<iostream>#include<string.h>#include<set>#include<stdio.h>#include<vector>#include<algorithm>#include<numeric>#include<math.h>#include<string.h>#include<sstream>#include<stdio.h>#include<string>#include<cstdlib>#include<algorithm>#include<iostream>#include<map>#include<queue>#include<iomanip>#include<cstdio>using namespace std;int ww[15][100005];int main(){    //freopen("r.txt","r",stdin);    int n,m,i,k,z,a,b,maxx,j;    while(cin>>n&&n!=0)    {memset(ww,0,sizeof(ww));        maxx=-1;        for(i=0;i<n;i++)        {            scanf("%d%d",&a,&b);            ww[a][b]++;            if(b>maxx) maxx=b;        }        for(k=maxx-1;k>=0;k--)        {            ww[0][k]+=max(ww[0][k+1],ww[1][k+1]);            ww[10][k]+=max(ww[10][k+1],ww[9][k+1]);            for(j=1;j<10;j++)            {                ww[j][k]+=max(ww[j-1][k+1],max(ww[j][k+1],ww[j+1][k+1]));            }        }        cout<<ww[5][0]<<endl;    }}
0 0
原创粉丝点击