UVALive 6486 Skyscrapers 简单动态规划
题意:
有N个格子排成一排,在每个格子里填上1到N的数(每个只能填一次),分别代表每个格子的高度。现在给你两个数left和right,分别表示从左往右看,和从右往左看,能看到的格子数。问有多少种情况。
数据范围: N<5000;
思路:
首先枚举最高的一块,在最高的格子的后面的格子都一定会被挡住。所以,除了最高的那一格之外,从左边能看到的格子,从右边一定看不到;从右边能看到的也是一样。
因此,除了最高的那个格子,左边的是否能被看见,和右边的无关。所以,我们可以以最高的格子为界,把这一排格子分成左右两部分。
在这样子,我们就可以把左边和右边看成是一种情况:把n个高度不等的方块排成一列,要求从前面只能看到k个,有多少种。
我们把上面问题(n个格子,看见k个)的结果记为f[n, k]。
对于上面那个问题,我们考虑两种情况:最高的放在最后,和最高的不放在最后。
1. 如果最高的放最后,因为最高的一定不会被挡住,所以,前面n-1个格子,需要被看见k-1个。
2. 如果最高的不放在最后,那么,最后一格一定会被挡住(因为最高的在它前面,而且会挡住他),所以前面n-1个格子,仍然需要被看见k个。
上面第一种,情况只有一种;而第二种情况有n-1种(把n-1个不是最高的中任意一个放到最后都满足)。
所以 f[n, k] = f[n-1, k-1] + (n-1)*f[n-1, k]。
另外就是边界情况,k=1的时候,这样一定就是最高的放最前面,后面随便放,所以就是 f[n, 1] = (n-1)!。
还有就是,组合数可以用杨辉三角来求,这个是学弟说的,本人数学功底太差 0 0、
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; typedef long long ll;
const int MAXN = ;
const ll MOD = (ll)1e9+7.0; ll dp[MAXN][MAXN];
ll C[MAXN][MAXN];
ll ni[MAXN]; int n, l, r;
ll ans; int main()
{
#ifdef Phantom01
freopen("in.txt", "r", stdin);
freopen("my.out", "w", stdout);
#endif // Phantom01 dp[][] = dp[][] = ;
for (int i = ; i < MAXN; i++)
dp[][i] = dp[i][] = ;
for (int i = ; i < MAXN; i++)
dp[i][] = (dp[i-][]*(i-))%MOD;
for (int i = ; i < MAXN; i++)
for (int j = ; j < MAXN; j++)
dp[i][j] = (dp[i-][j-]+(dp[i-][j]*(i-))%MOD)%MOD; for (int i = ; i < MAXN; i++) {
C[i][] = ;
for (int j = ; j <= i; j++)
C[i][j] = (C[i-][j]+C[i-][j-])%MOD;
} while (scanf("%d%d%d", &n, &l, &r)!=EOF) {
if (!(n||l||r)) break;
ans = ;
if ((l+r)<=(n+)) {
for (int i = l; i <= (n-r+); i++) {
ans = (ans+( ( (dp[i-][l-]*dp[n-i][r-])%MOD) *C[n-][i-])%MOD)%MOD;
}
}
printf("%d\n", (int)ans);
}
return ;
}
UVALive 6486 Skyscrapers 简单动态规划的更多相关文章
- 简单动态规划——三逆数的O(N^2)解法!
[算法]简单动态规划——三逆数的O(N^2)解法! 问题描述: 三逆数定义:给一个数的序列A[0,1,....N-1]),当i<j<k且A[i]>A[j]>A[k]时,称作ai ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- POJ 1163 The Triangle(简单动态规划)
http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
- 【算法】简单动态规划——三逆数的O(N^2)解法!
问题描述: 三逆数定义:给一个数的序列A[0,1,....N-1]),当i<j<k且A[i]>A[j]>A[k]时,称作ai,aj,ak为一个三逆数. 现在给定一个长度为N的数 ...
- 51nod 1270 数组的最大代价 思路:简单动态规划
这题是看起来很复杂,但是换个思路就简单了的题目. 首先每个点要么取b[i],要么取1,因为取中间值毫无意义,不能增加最大代价S. 用一个二维数组做动态规划就很简单了. dp[i][0]表示第i个点取1 ...
- HDU 1176 免费馅饼 简单动态规划
世道很简单的动态规划,但是却错了,让我很无语,改来改去还是不对,第二天有写就对了,之后我就耐着性子慢慢比较之前的错误代码,发现 第一次错:纯粹用了a[i][j]+=max3(a[i+1][j-1], ...
- HDUOJ----2571(命运)(简单动态规划)
命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 338. Counting Bits_比特位计数_简单动态规划
https://leetcode.com/problems/counting-bits/ 这是初步了解动态规划后做的第一道题,体验还不错... 看完题目要求后,写出前10个数的二进制数,发现了以下规律 ...
- hdu1176--免费馅饼(简单动态规划)
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就 ...
随机推荐
- (转载)BeanUtils.copyProperties() 用法
BeanUtils.copyProperties() 用法 标签: hibernateuserjdbc数据库strutsjava 2009-10-17 23:04 35498人阅读 评论(6) 收藏 ...
- 脱离node自己使用普通的requirejs管理js资源
首先,工程目录: 现在主页面(web框架写法.html): <!DOCTYPE html> <html lang="en"> <head> &l ...
- 使用python绘制词云
最近在忙考试的事情,没什么时间敲代码,一个月也没几天看代码,最近看到可视化的词云,看到网上也很多这样的工具, 但是都不怎么完美,有些不支持中文,有的中文词频统计得莫名其妙.有的不支持自定义形状.所有的 ...
- CSS3-----transform 转换
transforn 可以转换元素,其中主要属性有:rotate() / skew() / scale() / translate()以下4种. transform:rotate():旋转:其中“de ...
- easyui的datagrid右侧没有边框线
做项目时,用的easyui的框架的datagrid,运行时发现右侧没有边框,其它的都有边框,使用网页的审查元素可以看到datagrid样式里的宽度没有自动减去2个像素,这些都是easyui自算的宽高, ...
- 常见Json字符串反序列化处理方式总结
常用来处理Json字符串序列化 反序列化组件:Newtonsoft.Json (https://www.newtonsoft.com/json) 参考资料https://www.cnblogs.com ...
- Linxu基本指令
一.Linux权限的概念 Linux下有两种用户:普通用户和超级用户(). 普通用户:在linux下做有限的事情: 超级用户:可以在linux系统下做任何事情,不受限制. 普通用户的提示符是“$”,超 ...
- LA3231 Fair Share 二分_网络流
Code: #include<cstdio> #include<vector> #include<queue> #include<cstring> #i ...
- [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂
Code: #include<cstdio> using namespace std; typedef long long ll; const int maxn=10000000+1; l ...
- linux在线添加硬盘、扫盘
1:查看scsi 硬盘设备[root@web02 ~]# ls /sys/class/scsi_host host0 host1 host2 2:检查本机现有硬盘 [root@web02 ~]# fd ...