题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=309
题意:一个人参加越野比赛,有很多山头,过这些山头时不能超过指定的速度,他在刚开始时速度为1,他可以每秒加速或减速1m,或者保持不变,问他途中可以到达的最大的速度
思路:刚开始想的就是模拟,太乱看了别人的解题报告才知道是DP
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x7f7f7f7f;//2139062143
typedef long long ll;
using namespace std;
int dp[1010];
int main()
{
int l,n,i;
while(scanf("%d%d",&l,&n) != EOF)
{
int a,b;
memset(dp,0,sizeof(dp));
for(i=0; i<n; i++)
{
scanf("%d%d",&a,&b);
dp[a] = b;
}
int speed = 0;
for(i=0; i<=l; i++)
{
if(!dp[i])//没到山头一直加速
{
dp[i] = speed + 1;
}
else
{
if(dp[i] > dp[i-1])
{
dp[i] = dp[i-1] + 1;
}
else
{
int pos = i;
//while(dp[pos] < dp[pos-1])
while(dp[pos-1] - dp[pos] > 1)//更新之前的速度
{
dp[pos-1] = dp[pos] + 1;
pos--;
}
}
}
speed = dp[i];
}
int max1 = 0;
for(i=0; i<=l; i++)
{
if(dp[i] > max1)
{
max1 = dp[i];
}
}
printf("%d\n",max1);
}
return 0;
}