HDU 1176 免费馅饼

来源:互联网 发布:淘宝担保交易怎么弄 编辑:程序博客网 时间:2024/06/05 20:42

递推方程应该很好想,就是初值处理起来有点麻烦。在草稿纸上模拟一下就可以了

dp[i][j]表示i时刻处于j位置能接到的最大值

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int a[100005][15],dp[100005][15];void init(){memset(a,0,sizeof(a));memset(dp,0,sizeof(dp));for(int i=0;i<5;i++){for(int j=0;j<=10;j++) dp[i][j]=-1;}for(int i=0;i<5;i++){for(int j=5-i;j<=5+i;j++){dp[i][j]=0;}}}int main(){#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifint n,x,t;while(scanf("%d",&n),n){int maxt=0;init();for(int i=1;i<=n;i++) {scanf("%d%d",&x,&t);maxt=max(maxt,t);a[t][x]++;}for(int i=1;i<=maxt;i++){for(int j=0;j<=10;j++){if(j-1>=0&&dp[i-1][j-1]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]);if(dp[i-1][j]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]);if(j+1<=10&&dp[i-1][j+1]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j+1]+a[i][j]);}}int ans=0;for(int i=0;i<=10;i++) ans=max(ans,dp[maxt][i]);printf("%d\n",ans);}}


0 0
原创粉丝点击