HDU1176 免费馅饼
2017-05-15 19:15
316 查看
题目分析
用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; }
相关文章推荐
- HDU1176 免费馅饼 DP
- HDU1176 免费馅饼 树形DP
- hdu1176 免费馅饼(塔形)
- HDU1176:免费馅饼(DP)
- HDU1176-基础dp-免费馅饼
- HDU1176 免费馅饼
- HDU1176 免费馅饼 经典DP
- 解题报告 HDU1176 免费馅饼
- 【HDU1176】免费馅饼
- HDU1176:免费馅饼(DP)
- hdu1176 免费馅饼 DP
- 【HDU1176】免费馅饼(类数塔问题)
- hdu1176 免费馅饼 动态规划
- 免费馅饼 hdu1176 动态规划 数塔
- HDU1176 免费馅饼
- hdu1176 免费馅饼 ——DP
- hdu1176 免费馅饼(传说这是数塔的变换形式)
- [hdu1176]免费馅饼(数塔dp)
- HDU1176----免费馅饼
- HDU1176 免费馅饼(水DP)