hdu 1176

来源:互联网 发布:怎么制作抽奖软件 编辑:程序博客网 时间:2024/06/11 10:25
//这道题可以转换成数塔问题//将时间为纵轴,距离为横轴//从上往下DP//DP[i][j] = max{DP[i+1][j-1],DP[i+1][j],DP[i+1][j+1]} + a[i][j]//吐槽一下,WA了很多次,原因是max函数写错了尼玛啊啊#include <stdio.h>#include <string.h>#define max(a,b) a>b?a:b int n;int a[100001][11];int DP[100001][11];int max1(int a,int b,int c){int max2;max2 = a > b?a:b;max2 = max2 > c?max2:c;return max2;}int main(){while(scanf("%d",&n) != EOF){if( n == 0)break;int x,T;memset(a,0,sizeof(a));memset(DP,0,sizeof(DP));int max_T = 0;for(int i = 0; i < n; i++){scanf("%d%d",&x,&T);a[T][x] ++;DP[T][x] = a[T][x];if(T > max_T){max_T = T;}}                                for(int i = 0; i <= 10; i++)                {                      DP[max_T][i] = a[max_T][i];                }                for(int i = max_T-1; i >= 0; i--){for(int j = 1; j <= 9; j++){DP[i][j] = max1(DP[i+1][j-1],DP[i+1][j+1],DP[i+1][j]) + a[i][j];}DP[i][0] = max(DP[i+1][0],DP[i+1][1]) + a[i][j];DP[i][10] = max(DP[i+1][9],DP[i+1][10]) + a[i][j];}printf("%d\n",DP[0][5]);}return 0;}

原创粉丝点击