hdu1176 kuangbin dp专题

版权声明:那个,最起码帮我加点人气吧,署个名总行吧 https://blog.csdn.net/qq_41670466/article/details/83478179

思路:对于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;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/83478179