HDU 1159 【DP数塔变形】
2016-01-30 15:32
246 查看
在一条X轴上,每个点在每个时刻都会有一定数量的饼,
问在规定时间内,可以可以最多得到多少饼;
就是把矩阵转化为数塔,在每个时刻的某个位置都有三种可以到达当前位置的可能性;
即:左边,不动,右边;
DP[i][j]表示第i秒第j位置有多少个馅饼
状态转移方程为:dp[i][j]+=maxi(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]); 即三个点中的最大值+下一此位置 = 最大收纳;
所以AC代码为:
问在规定时间内,可以可以最多得到多少饼;
就是把矩阵转化为数塔,在每个时刻的某个位置都有三种可以到达当前位置的可能性;
即:左边,不动,右边;
DP[i][j]表示第i秒第j位置有多少个馅饼
状态转移方程为:dp[i][j]+=maxi(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]); 即三个点中的最大值+下一此位置 = 最大收纳;
所以AC代码为:
#include<iostream> #include<cstring> using namespace std; int maxi(int a,int b,int c) { int max1; max1=a>b?a:b; max1=max1>c?max1:c; return max1; } int dp[100001][11]; int main() { int i,j; int n,a,b; while(~scanf("%d",&n),n) { int m=0; memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) { cin>>a>>b; //*a是位置,b是最多位置的馅饼; dp[b][a]++; if(m<b) m=b;; } for(i=m-1;i>=0;i--) //*从0饼,中间位置向两遍搜 { for(j=1;j<=9;j++) { dp[i][j]+=maxi(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]); } dp[i][0]+=max(dp[i+1][0],dp[i+1][1]); dp[i][10]+=max(dp[i+1][10],dp[i+1][9]); } cout<<dp[0][5]<<endl; }return 0; }
相关文章推荐
- LDD3源码分析之llseek分析
- 页面无法按照样式表进行渲染的诡异问题
- Android 学习1----控件的学习
- android 编写动画
- GCC hash_map中string为key的解决方法[Linux]
- 关于android Widgets桌面小插件的开发大概流程
- Windows自删除程序和DLL
- Leetcode题解(20)
- Windows自删除程序和DLL
- Java 数字转为可朗读中文的函数
- android学习记录1(ADT,SDK,ADB,点击事件等基础使用)
- GCC hash_map中string为key的解决方法[Linux]
- RecyclerView item 状态错乱
- 小娜学法(20):Win 10剥离可信计算,时光倒流二十年
- 合并石子
- 关于二进制中1的个数
- 回调函数的实质——什么是回调函数,为什么要使用回调函数
- 后缀数组,处理字符串问题经常会用到
- opencv关于imread读不到图像的问题
- 三层登录VB.NET实现