天天写算法之免费馅饼
2018-03-22 10:06
274 查看
点击打开链接原题链接
这个题坑真的很多,先说的确是dp问题,为什么会想到dp呢,因为这一个chapter都是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];得到了这个式子只是第一步。
开始入坑。题目给的position和t是先p后
9752
t这样的顺序进行的。这样就很容易诱导我们创建一个【p】【t】的二维数组。从而我们很有可能循环的时候寻找每个位置,所有时刻的最佳值。但很明显我们上边那个式子是相悖的。因为我们是以位置为先导,因此我们需要找到的是位置的先后关系,而不是时间i与i-1的先后关系。
那么好了,假设你完成了这个bug,从这个坑里出来了,那么来看第二个坑,第一次的循环一定不能不管dp【1】【5】 dp【1】【6】 dp【1】【4】,因为这一行直接决定了,你是否用到了题目给的条件,不然直接gg。其他位置是不可能出现值的,即使那个地方a【1】【i】不为0,但是f一定为0.上代码
这个题坑真的很多,先说的确是dp问题,为什么会想到dp呢,因为这一个chapter都是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 <iomanip> #include<queue> #include<math.h> #include<algorithm> #include<string.h> #include<stdlib.h> #include<stdio.h> #include<iomanip> #include<string.h> #include<sstream> #include<string> //¶¨Ò庯Êý¶Î #define repf(i,a,b) for(int i =(a);i<(b);i++) #define repfe(i,a,b) for(int i =(a);i<=(b);i++) using namespace std; const int inf = -1000; int data[100001][12]; int dp[100001][12]; int main() { int num,position,t,Max,MaxT = 0,tempDp = -1; while(cin>>num&&num!=0) { memset(data,0,sizeof(data)); repfe(i,1,num) { cin>> position>> t ; if(t>MaxT) { MaxT = t ; } data[t][position] ++; } memset(dp,0,sizeof(data)); dp[1][4] = data[1][4]; dp[1][5] = data[1][5]; dp[1][6] = data[1][6]; repfe(i,2,MaxT) { repf(j,0,11) { tempDp = -1 ; tempDp = max(tempDp,dp[i-1][j]); if(j<10) tempDp = max(tempDp,dp[i-1][j+1]); if(j>0) tempDp = max(tempDp,dp[i-1][j-1]); dp[i][j] = tempDp + data[i][j]; // cout << j <<" " << i <<" "<<dp[j][i]<<endl; } } int res = 0 ; repf(i,0,12) { if(dp[MaxT][i]>res) { res = dp[MaxT][i]; } } cout <<res <<endl; } return 0; }
开始入坑。题目给的position和t是先p后
9752
t这样的顺序进行的。这样就很容易诱导我们创建一个【p】【t】的二维数组。从而我们很有可能循环的时候寻找每个位置,所有时刻的最佳值。但很明显我们上边那个式子是相悖的。因为我们是以位置为先导,因此我们需要找到的是位置的先后关系,而不是时间i与i-1的先后关系。
那么好了,假设你完成了这个bug,从这个坑里出来了,那么来看第二个坑,第一次的循环一定不能不管dp【1】【5】 dp【1】【6】 dp【1】【4】,因为这一行直接决定了,你是否用到了题目给的条件,不然直接gg。其他位置是不可能出现值的,即使那个地方a【1】【i】不为0,但是f一定为0.上代码
相关文章推荐
- 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼
- hdoj.1176 免费馅饼 20141030
- nyist 613 免费馅饼
- HDU 1176 免费馅饼
- hdu 1176 免费馅饼(dp)
- 天天算法02——删除字符串中所给定的字符串
- 免费馅饼 OJ 613
- 【阿里云大学免费精品课】机器学习入门:概念原理及常用算法
- HDU - 1176 免费馅饼
- 动态规划训练18 [免费馅饼 HDU - 1176 ]
- hdu/hdoj 1176-免费馅饼
- HDU 1176 免费馅饼 水dp
- HDU_1176_免费馅饼_16.4.23再做
- 动态规划:HDU1176-免费馅饼
- C语言动态规划(11)___免费馅饼
- NYOJ 613免费馅饼 动态规划解法
- nyoj 免费馅饼 613 (DP状态转移方程)
- 免费馅饼
- 1644 免费馅饼 题解(c++)
- HDU-1176 - 免费馅饼