6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
这里采用的是自顶向下的。个人觉得采用自底向上会好些,就是说按时间的逆序循环,可以少一些判断。最后输出 arr[0][5]
#include <stdio.h> #include <string.h> int n; int arr[100000][13]; int opts[13], a, b, T; int mymax(int a, int b, int c) { a = a > b ? a : b; return a > c ? a : c; } int main() { while (scanf("%d", &n), n) { memset(arr, 0, sizeof(arr)); for (int i = 0; i < n; i++) { scanf("%d %d", &a, &b); arr[b][a + 1]++; if (T < b) T = b; } memset(opts, 0, sizeof(opts)); for(int i=1; i<5; i++){ //由于从位置5开始,最开始的几行两端是不可达的 for(int j=0; j<6-i; j++) arr[i][j] = 0; for(int j=12; j>6+i; j--) arr[i][j] = 0; } for (int i = 2; i <= T; i++) for (int j = 1; j <= 11; j++) arr[i][j] += mymax(arr[i-1][j-1],arr[i-1][j],arr[i-1][j+1]); int max = 0; for (int j = 1; j <= 11; j++) if(max < arr[T][j]) max = arr[T][j]; printf("%d\n",max); } return 0; }