HDU 1176(二維動態規劃)
阿新 • • 發佈:2019-01-26
分析: 和2084的數塔非常相似,不同的只是此題只用求三個數的最值。其實本質一樣的,即自頂向底找一條權值最大的路徑。理解數塔,這題也就更好理解了。
對於每一個位置,它下方的三個數是它下一秒可以到達的位置。
因此要求0秒5位置可以或得的最大值,只需自底向上更新資料。
dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
dp[i][j] 表示,第i秒,在位置j處可或得的最大值。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100002
int dp[N][15];
int maxx(int a,int b,int c)
{
a=max(a,b);
c=max(a,c);
return c;
}
int main()
{
int n,x,t;
while(scanf("%d",&n),n)
{
int max_t=0;
memset(dp,0,sizeof(dp));
while(n--)
{
scanf("%d%d" ,&x,&t);
dp[t][x]++;
max_t=max(max_t,t);
}
for(int i=max_t-1;i>=0;i--)
for(int j=0;j<11;j++)
dp[i][j]+=maxx(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
printf("%d\n",dp[0][5]);
}
return 0;
}