此题目必须开二维数组以暂存不同时间的数据
从上到下(时间大到小)比较简单,最后输出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; }