codeforce 479E Riding in a Lift
2016-04-09 13:40
375 查看
原题地址
题意
一个N层建筑,有一台电梯,一个人开始时位于a层,他觉得坐电梯上上下下K次,建筑的b层有一个实验室,实验室禁止进入,而且对于人每次坐电梯有限制条件
假如目前人在X层,希望坐电梯去Y层,需要满足
abs(X-Y)<abs(X-b)
问人这K次上上下下总共有多少种方案,答案对1e9+7取模
题解
DP啦,状态转移比较好搞吧,有两个问题,一个是严格大于的写法,一个是剩余系下减法要避免出现负数
题意
一个N层建筑,有一台电梯,一个人开始时位于a层,他觉得坐电梯上上下下K次,建筑的b层有一个实验室,实验室禁止进入,而且对于人每次坐电梯有限制条件
假如目前人在X层,希望坐电梯去Y层,需要满足
abs(X-Y)<abs(X-b)
问人这K次上上下下总共有多少种方案,答案对1e9+7取模
题解
DP啦,状态转移比较好搞吧,有两个问题,一个是严格大于的写法,一个是剩余系下减法要避免出现负数
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=5000; const int H=1e9+7; int dp[maxn+5][maxn+5]; int sum[maxn+5][maxn+5]; int main(void) { #ifdef ex freopen ("in.txt","r",stdin); #endif int n,a,b,k; scanf("%d%d%d%d",&n,&a,&b,&k); dp[0][a]=1; for (int i=a;i<=n;++i) { sum[0][i]=1; } if (a<b) { for (int i=1;i<=k;++i) { for (int j=1;j<=b-1;++j) { int h=ceil((b+j*1.0)/2-1); dp[i][j]=sum[i-1][h]; if (j<=h) dp[i][j]=(dp[i][j]-dp[i-1][j]+H)%H; sum[i][j]=(sum[i][j-1]+dp[i][j])%H; } } printf("%d\n",sum[k][b-1]); #ifdef ex1 cout<<dp[2][1]<<endl; cout<<dp[2][2]<<endl; cout<<dp[2][3]<<endl; #endif } else { for (int i=1;i<=k;++i) { for (int j=b+1;j<=n;++j) { int h=floor((b+j*1.0)/2+1); dp[i][j]=(sum[i-1] -sum[i-1][h-1]+H)%H; if (j>=h) dp[i][j]=(dp[i][j]-dp[i-1][j]+H)%H; sum[i][j]=(sum[i][j-1]+dp[i][j])%H; } } printf("%d\n",sum[k] -sum[k][b]); } }
相关文章推荐
- 第六周学习进度条
- 局域网内利用gitlab,jenkins自动生成gitbook并发布(nginx)
- 第22篇《北大清华管理课》读后笔记
- 2016蓝桥杯第三题
- 如何在windows平台下编译比特币bitcoin客户端
- LeetCode 21 Merge Two Sorted Lists
- UNIX BUILD NOTES
- 快速递归算法遍历生成De Bruijn序列
- Dalvik与ART的区别:
- 新手笔记之安卓自定义title标题栏使用
- C++实现双向链表
- CDOJ 1134 男神的约会
- IGreen爱绿项目APP和智能设备 v1.0(测试版)
- 使用存储过程进行分页查询
- Java中的length、length()、size的用法
- 2016蓝桥杯第二题 依旧水题
- C#-密度较量
- ubuntu下从源码编译比特币(Bitcoin)客户端
- [置顶] WPF TreeviewItem Click 事件
- 20616蓝桥杯第一题 水题