1. 程式人生 > >hdu1176 kuangbin dp專題

hdu1176 kuangbin dp專題

思路:對於dp之類的題來說最重要的就是轉移方程的建立吧,在這道題中我們可以得知人要想到達x點,他只能從x+1處,x-1處或者x處原地不動來到達,那麼轉移方程也就同樣建立起來,唯一需要注意的一點大概就是對於0和10這兩個臨界點的處理。

程式碼:

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

const int maxn = 1e5 + 10;
int num[maxn][11];
int dp[maxn][11];//dp[I][j]表示的是第I秒到達j點時的所裝的餡餅數

int main()
{
		int n;
		while (scanf("%d", &n) && n)
		{
				int mx = 0;
				memset(dp, 0, sizeof(dp));
				memset(num, 0, sizeof(num));
				for(int i=0;i<n;i++)
				{
						int a, t;
						scanf("%d %d", &a, &t);
						if (t == 1 && (a == 4 || a == 6||a==5))
								dp[1][a]++;
						num[t][a]++;
						mx = mx > t ? mx : t;
				}
				for (int i = 2; i <=mx; i++)
				{
						for (int j = 0; j < 11; j++)
						{
								if (j == 0)
										dp[i][j] = max(dp[i - 1][0], dp[i - 1][1]) + num[i][0];
								else if (j == 10)
										dp[i][10] = max(dp[i - 1][10], dp[i - 1][9]) + num[i][10];
								else
										dp[i][j] = max(dp[i - 1][j - 1], max(dp[i - 1][j], dp[i - 1][j + 1])) + num[i][j];
						}
				}
				int mt = 0;
				for (int i = 0; i < 11; i++)
						mt = mt > dp[mx][i] ? mt : dp[mx][i];
				printf("%d\n", mt);
		}
		//system("pause");
		return 0;
}