URAL1918--Titan Ruins: Artful Manipulations-----计数DP(被别人写的博客坑死了)
来源:互联网 发布:网络风油精是什么意思 编辑:程序博客网 时间:2024/06/05 00:08
题目地址:http://acm.timus.ru/problem.aspx?space=1&num=1918
首先来说题目的意思,我在网上搜到了一个博客
但是个人感觉那人写的真的让人,唉,还不如不写。。。
在一个平台上,可以放1~n个硬币
然后你有n个魔术棒,当第i个魔术棒在第j个位置的时候,可以将这i个硬币变为j个硬币
且你的硬币为i个时才可以使用第i个魔术棒
然后问你有多少种排序方式来放置魔术棒,使得硬币可以由1变为n个
另外,硬币是可以自动减少的,每次减一个,这个也是个很关键的条件
我们令dp[i][j]表示在i个硬币内能够变的最大值为j
那么我们可以推出一个公式dp[i][j] = dp[i-1][j]*j+sum(dp[i-1][k]) i-1<k<j
dp[i-1][j]*j的意思是前面i-1个硬币的情况下就可以到达j,那么我这个第i个可以放到1~j的任意位置,这个应该比较好想
然后再就是sum(dp[i-1][k]) i-1<k<j 这个的意思是我的第i个的魔术棍放到j那里,前面的都是小于j的,但是为什么k要>i-1呢
因为我们是在有i个硬币的情况下才能到达j,那么前面的i-1个里面一定要有一个能够到达i,如果k小于i的话,根本就没有一个魔术棍可以放到i的位置上
再就是如果i>j的话dp[i][j]是为0的,想一想,为什么?
另外sum(dp[i-1][k]) 也不用O(n)的算法去算,直接在循环的过程中用一个前缀数组就可以轻易的把和求出来
n比较大,5000*5000的long long肯定会爆,所以用滚动数组,因为每次i都只是依赖i-1的
下面上我的代码:
#include<cstdio>#include<cstring>using namespace std;#define LL long longconst int maxn = 5000+10;const int MOD = 1000000000+7;LL dp[2][maxn];LL sum[2][maxn];int n;void solve(){ for(int i=1;i<=n;i++) { dp[1][i] = 1; sum[1][i] +=sum[1][i-1]+dp[1][i]; } for(int i=2;i<=n;i++) { for(int j=1;j<=n;j++) { if(i>j) { dp[i%2][j] = 0; continue; } dp[i%2][j] = dp[(i-1)%2][j]*j%MOD; dp[i%2][j] = (dp[i%2][j]+sum[(i-1)%2][j-1]-sum[(i-1)%2][i-1]+MOD)%MOD; sum[i%2][j] = (sum[i%2][j-1]+dp[i%2][j])%MOD;//前缀数组 } }}int main(){ while(~scanf("%d",&n)) { solve(); printf("%lld\n",dp[n%2][n]%MOD); } return 0;}
- URAL1918--Titan Ruins: Artful Manipulations-----计数DP(被别人写的博客坑死了)
- ural 1917. Titan Ruins: Deadly Accuracy(Titan Ruins系列)
- ural 1910. Titan Ruins: Hidden Entrance(Titan Ruins系列题目)
- URAL 1910 Titan Ruins: Hidden Entrance (阅读理解)
- UVA 12647 Balloon (线段树) URAL 1915Titan Ruins: Reconstruction of Bygones (暴力,树状数组)
- ural 1915. Titan Ruins: Reconstruction of Bygones
- Ural 1910. Titan Ruins: Hidden Entrance
- URAL:1917 Titan Ruins: Deadly Accuracy
- URAL - 1917 Titan Ruins: Deadly Accuracy(水题)
- Ural 1910. Titan Ruins: Hidden Entrance
- URAL 1910. Titan Ruins: Hidden Entrance
- URAL 1910 Titan Ruins: Hidden Entrance
- URAL 1910. Titan Ruins: Hidden Entrance
- 一年多没写博客了,忙死了
- csdn写的文章全没了,而且在多了别人写的文章,晕死了,到底是怎么回事呢!!!
- URAL 1910 Titan Ruins: Hidden Entrance 题解与翻译
- URAL 1915 Titan Ruins: Reconstruction of Bygones(思路)
- URAL - 1920 Titan Ruins: the Infinite Power of Magic(乱搞)
- Decrypting LSA Secrets
- [商业模式] 去哪儿 PK OTA
- Oracle 学习笔记2 —— 用户管理
- 通信率转换(转)
- 时间差函数使用
- URAL1918--Titan Ruins: Artful Manipulations-----计数DP(被别人写的博客坑死了)
- CHEMKIN-PRO笔记
- 堆和堆排序
- Linux下获取毫秒级时间
- 找android新手,老手一起学习
- 关于使用strut2标签进行传值的问题
- vbs 自动登录google邮箱
- Jquery插件之仿百度感应搜索
- http://acm.hdu.edu.cn/showproblem.php?pid=1907,与杭电2509题类似。