HDU 1176 基础DP
2013-10-08 19:51
197 查看
由于刚开始搞DP,看了一下大牛的思路,才写出这题,这题中这人移动有三种方法,要么不移动,要么向左移动,要么向右移动,那么 用a[i][j]表示的是在i秒j点有多少个饼掉下来,f[i][j]表示的是直到在i秒j点一共接到多少个饼,就可以写出一个状态方程,也就是关键解题思路: f[i][j]=max(f[i-1][j-1],f[i-1][j],f[i-1][j+1])+a[i][j]; 利用这个思路就可以解决这个问题: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[100005][12],f[100005][12]; int n,x,t; int main() { int i,j,maxt; while(scanf("%d",&n),n) { memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); maxt=0; for(i=0; i<n; i++) { scanf("%d%d",&x,&t); maxt=max(maxt,t); ++a[t][x];//这里就是题目中提到在同一秒同一个地点可能掉落多个馅饼 } f[1][4]=a[1][4]; f[1][5]=a[1][5]; f[1][6]=a[1][6]; for(i=2; i<=maxt; i++) { for(j=0; j<11; j++) { f[i][j]=f[i-1][j]; if(j>0)f[i][j]=max(f[i][j],f[i-1][j-1]);//这里因为是j-1,所以要注意范围 if(j<10)f[i][j]=max(f[i][j],f[i-1][j+1]);//这里因为是j+1,所以要注意范围 f[i][j]+=a[i][j]; } } int sum=0; for(i=0; i<11; i++) { sum=max(sum,f[maxt][i]);//这里就是和最后时间每个地点所能接到的饼相比较 } printf("%d\n",sum); } return 0; }
相关文章推荐
- HDU-1176(基础方程DP)
- [kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼(HDU 1176)
- 【基础dp】HDU 1176 免费馅饼
- HDU 1176(基础DP)
- HDU-1176(基础方程DP)
- [kuangbin带你飞]专题十二 基础DP1 G HDU 1176
- HDU 1176 免费馅饼(基础DP)
- HDU 2457 ac机+DP(基础DP)
- 【HDU 1176】免费馅饼( dp )
- J - FatMouse's Speed HDU - 1160——基础dp
- HDU-2059龟兔赛跑(基础方程DP-遍历之前的所有状态)
- 免费馅饼(Hdu_oj1176)DP
- HDU1176 免费馅饼 (数塔DP)
- dp基础-2 N - Longest Ordered Subsequence POJ - 2533+ HDU - 1257最少拦截系统
- HDU 2059 龟兔赛跑(DP和多阶段策略问题,基础题)
- dp基础6--[HDU-2859] 最大对称矩阵
- HDU---1176-免费馅饼(DP)
- hdu 1087 Super Jumping! Jumping! Jumping!(基础DP,最大上升子序列和)
- 免费馅饼 - HDU 1176 dp
- HDU 1176 免费馅饼(简单dp)