1. 程式人生 > >hdu1176 免費餡餅

hdu1176 免費餡餅

題意:
在一條線上一個人最初在5點,美妙只能向兩邊移動一個位置,給你每個時間段掉餡餅的個數,問最後可以接到多少個餡餅。
一個變形的數塔問題,最上面是一個頂點,每個時間是一層轉移。

#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h> #include <stack> #include <algorithm> #include <list> #include <ctime> #include <memory.h> #include <ctime> #include <assert.h> #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back
#define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define eps 1e-8 #define M_PI 3.141592653589793 typedef long long ll; const ll mod=1000000007; const int inf=99999999; ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return
res;} using namespace std; int dp[100000+10][15],M[100000+10][15]; int main() { int n; while(~scanf("%d",&n)&&n) { int T=0; memset(dp,0,sizeof(dp)); memset(M,0,sizeof(M)); for(int i=0;i<n;i++) { int a,b;scanf("%d%d",&a,&b); M[b][a]++; T=max(T,b); } //cout<<"T="<<T<<endl; for(int i=1;i<=11;i++) dp[T][i]=M[T][i]; for(int i=T-1;i>=0;i--) { for(int j=1;j<=11;j++) { dp[i][j]=max(dp[i+1][j+1],max(dp[i+1][j-1],dp[i+1][j]))+M[i][j]; } } printf("%d\n",dp[0][6]); } }