此题目必须开二维数组以暂存不同时间的数据
从上到下(时间大到小)比较简单,最后输出dp[0][5]的值就可以了。即使dp[0][1-4,6-10]某的数据比dp[0][5]大也不用管。因为开始时(0秒)人站在dp[0][5]的地方,dp[0][5]的结果是有大到小至的dp[1][4],dp[1][5],dp[1][6]的最大值。其余同理。
Java实现代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main
{
public static int max(int a, int b)
{
return a>b? a : b;
}
public static int max(int a, int b, int c)
{
int mid = b;
if(a>mid) mid = a;
if(c>mid) mid = c;
return mid;
}
public static void main(String[] args) throws IOException
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
int[][] data = new int[100010][12];
int mid;
while(true)
{
mid = Integer.parseInt(stdin.readLine());
if(mid==0) return;
for(int i=0; i<100010; ++i)//二维数组初始化
for(int j=0; j<12; ++j)
data[i][j] = 0;
int maxTime = 0;
for(int t=0; t<mid; ++t)
{
String[] temp = stdin.readLine().split(" ");
int a = Integer.parseInt(temp[0]);
int b = Integer.parseInt(temp[1]);
data[b][a]++;
if(b>maxTime) maxTime = b;
}
for(int i=maxTime-1; i>=0; --i)
{
for(int j=0; j<=10; ++j)
{
if(j==0) data[i][j] += max(data[i+1][j], data[i+1][j+1]);
else if(j==10) data[i][j] += max(data[i+1][j-1], data[i+1][j]);
else data[i][j] += max(data[i+1][j-1], data[i+1][j], data[i+1][j+1]);
}
}
System.out.println(data[0][5]);
}
}
}
/*
6
5 1
4 1
6 1
7 2
7 2
8 3
3
5 2
5 1
5 3
0
*/
cpp代码如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
//此题目必须用一个二维数组占存所有的T时数据, 不能换成两个一维数组
int dp[100005][12];//第t秒在第x位置所接陷饼数
int max(int a,int b)
{
return a>b?a:b;
}
int max(int a,int b,int c)
{
int q=a>b?a:b;
int w=b>c?b:c;
return q>w?q:w;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int maxn=0;
memset(dp,0,sizeof(dp));
while(n--)
{
int t=0,x=0;
scanf("%d%d",&x,&t);
dp[t][x]++;
if(maxn<t)maxn=t;
}
for(int i=maxn-1;i>=0;i--)
{
for(int j=0;j<=10;j++)
{
if(j==0)
{
dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
}
else if(j==10)
{
dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j-1]);
}
else
{
dp[i][j]=dp[i][j]+max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
}
}
}
printf("%d\n",dp[0][5]);
}
return 0;
}