UVALive 6801
2016-08-24 21:25
246 查看
很水的dp,和学长推了一下午,也是够了。。
dp这个东西一下想明白了就发现很水,重要的是想不出来- -!
第一维代表当前走到了第几步,第二维代表剩余几个1。
状态转移:dp[i][j] += dp[i - 1][j + 1] * (j + 1)(代表前一个选了1,有j+1种选法);dp[i][j] += dp[i - 1][j - 1] * (n - j + 1)(代表前一个选了0,有n-j+1种选法)。
然后最后结果就是走完了k步,剩余0个1,即dp[k][0]。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <climits>
#include <queue>
using namespace std;
const int MOD = 1000000007;
long long dp[1005][1005];
int x;
int main()
{
int T;
int kase = 0;
scanf("%d", &T);
while(T--)
{
memset(dp, 0, sizeof(dp));
int tmp = 0;
int n, k;
scanf("%d%d", &n, &k);
for(int i = 0; i < n; ++i)
{
scanf("%d", &x);
if(x)
++tmp;
}
dp[0][tmp] = 1;
for(int i = 1; i <= k; ++i)
{
for(int j = 0; j <= n; ++j)
{
if(j - 1 >= 0)
dp[i][j] = (dp[i][j] + dp[i - 1][j - 1] * (n - j + 1)) % MOD;
if(j + 1 <= n)
dp[i][j] = (dp[i][j] + dp[i - 1][j + 1] * (j + 1)) % MOD;
}
}
printf("Case #%d: %lld\n", ++kase, dp[k][0]);
}
}
dp这个东西一下想明白了就发现很水,重要的是想不出来- -!
第一维代表当前走到了第几步,第二维代表剩余几个1。
状态转移:dp[i][j] += dp[i - 1][j + 1] * (j + 1)(代表前一个选了1,有j+1种选法);dp[i][j] += dp[i - 1][j - 1] * (n - j + 1)(代表前一个选了0,有n-j+1种选法)。
然后最后结果就是走完了k步,剩余0个1,即dp[k][0]。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <climits>
#include <queue>
using namespace std;
const int MOD = 1000000007;
long long dp[1005][1005];
int x;
int main()
{
int T;
int kase = 0;
scanf("%d", &T);
while(T--)
{
memset(dp, 0, sizeof(dp));
int tmp = 0;
int n, k;
scanf("%d%d", &n, &k);
for(int i = 0; i < n; ++i)
{
scanf("%d", &x);
if(x)
++tmp;
}
dp[0][tmp] = 1;
for(int i = 1; i <= k; ++i)
{
for(int j = 0; j <= n; ++j)
{
if(j - 1 >= 0)
dp[i][j] = (dp[i][j] + dp[i - 1][j - 1] * (n - j + 1)) % MOD;
if(j + 1 <= n)
dp[i][j] = (dp[i][j] + dp[i - 1][j + 1] * (j + 1)) % MOD;
}
}
printf("Case #%d: %lld\n", ++kase, dp[k][0]);
}
}
相关文章推荐
- UVaLive/LA 6801 Sequence(DP)
- UVaLive 6801 Sequence (计数DP)
- UVALive 6801 Sequence (DP)
- UVALive - 6801 Sequence
- UVALive 4627 -- Islands (并查集)
- UVALive - 3902 Network
- UVALive 3683 A Scheduling Problem(树形DP)
- UVALive 3029 City Game (扫描维护)
- UVALive 3695 Distant Galaxy (部分枚举,扫描维护)
- UVALive 4857 Halloween Costumes
- HDOJ 3664 Permutation Counting / UVALive 5092 DP
- 【UVALIVE 5713】秦始皇修路(最小瓶颈路+Kruskal)
- UVALive 6837 There is No Alternative (MST+暴力LCA)
- UVALIVE 3942 Remember the Word 字典树
- UVALive6336 HDU4450 Draw Something【水题】
- UVALive:6182 Ginkgo Numbers
- UVALive 3938 "Ray, Pass me the dishes!"
- UVALive - 6809 Spokes Wheel(位运算)
- UVALive 6269 Digital Clock --枚举,模拟
- 文章标题 UVALive 7035: Built with Qinghuai and Ari Factor(水)