HDU1176 免费馅饼

来源:互联网 发布:微信share js sdk 编辑:程序博客网 时间:2024/06/05 14:43

题目分析

用f[i][j]表示第i秒在j位置可以共计接到的馅饼数。然后就很容易得到状态转移方程f[i][j]=max(f[i-1][j-1],f[i-1][j],f[i-1][j+1])+s[i][j]; s[i][j]表示i秒在j位置可以接到的馅饼数(没有共计两个字)。注意几点:
1.某时间某位置可能不只掉一个馅饼。
2.第1秒只有4,5,6三个位置可能接到馅饼
然后随便搞搞就A了。

代码

#include<iostream>#include<cstdio>#include<climits>#include<algorithm>#include<cstring>#include<queue>using namespace std;int read(){    int q=0;char ch=' ';    while(ch<'0'||ch>'9')ch=getchar();    while(ch>='0'&&ch<='9')q=q*10+ch-'0',ch=getchar();    return q;}int w,h,n;int f[100001][12];int main(){    int i,j,T,x,t,cnt=0,ans;    while(1){        n=read();if(!n)break;        T=0;memset(f,0,sizeof(f));        for(i=1;i<=n;i++){            x=read(),t=read();            T=max(t,T);f[t][x]++;        }        for(i=0;i<=3;i++)f[1][i]=0;for(i=7;i<=10;i++)f[1][i]=0;        //注意第1秒只有4,5,6三个位置可以接馅饼        for(i=1;i<=T;i++)            for(j=0;j<=10;j++){                ans=0;                if(j!=0)ans=max(ans,f[i-1][j-1]+f[i][j]);                if(j!=10)ans=max(ans,f[i-1][j+1]+f[i][j]);                ans=max(ans,f[i-1][j]+f[i][j]);                f[i][j]=ans;            }        ans=0;for(i=0;i<=10;i++)ans=max(ans,f[T][i]);        printf("%d\n",ans);    }    return 0;}
原创粉丝点击