[HDU 1176 DP] 免费馅饼

dp[i][j]代表i时刻j位置最多的馅饼数量初始时只有dp[1][4],dp[1][5],dp[1][6]有值,转移方程为:

dp[i][j] = max(dp[i][j],dp[i - 1][j] + cnt[i][j]);
				if(j - 1 >= 0)
					dp[i][j] = max(dp[i][j],dp[i - 1][j - 1] + cnt[i][j]);
				if(j + 1 <= 10)
					dp[i][j] = max(dp[i][j],dp[i - 1][j + 1] + cnt[i][j]);

AC代码:

#include<bits/stdc++.h>
#define pb push_back
#define se second
#define fi first
#define mp make_pair
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
ll dp[N][11],ans;
int cnt[N][11];
int n,x,T,maxT;
vector<pair<int,int > > v;
int main(){
    
    
	while(scanf("%d",&n)){
    
    
		if(n == 0)break;
		maxT = 0,ans = 0;
		v.clear();
		for(int i = 0;i < n;i++){
    
    
			scanf("%d%d",&x,&T);
			maxT = max(maxT,T);
			v.pb(mp(x,T));
		}
		for(int i = 1;i <= maxT;i++){
    
    
			for(int j = 0;j <= 10;j++)
				dp[i][j] = 0,cnt[i][j] = 0;
		}
		for(int i = 0;i < n;i++)
			cnt[v[i].se][v[i].fi]++;
		dp[1][4] = cnt[1][4],dp[1][5] = cnt[1][5],dp[1][6] = cnt[1][6];
		ans = max(dp[1][4],max(dp[1][5],dp[1][6]));
		for(int i = 2;i <= maxT;i++){
    
    
			for(int j = 0;j <= 10;j++){
    
    
				dp[i][j] = max(dp[i][j],dp[i - 1][j] + cnt[i][j]);
				if(j - 1 >= 0)
					dp[i][j] = max(dp[i][j],dp[i - 1][j - 1] + cnt[i][j]);
				if(j + 1 <= 10)
					dp[i][j] = max(dp[i][j],dp[i - 1][j + 1] + cnt[i][j]);
				ans = max(ans,dp[i][j]);	
			}
		}
		printf("%lld\n",ans);
		
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_20252251/article/details/108367881