博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DP ZOJ 2745 01-K Code
阅读量:5161 次
发布时间:2019-06-13

本文共 1010 字,大约阅读时间需要 3 分钟。

 

题意:要求任意连续子序列中0和1的数量差不超过k的方案数

分析:想好状态其实不难。dp[i][j][k]表示考虑前i长度,后缀中最大的 sum(0) - sum(1) = j, sum (1) - sum (0) = k的方案数,合并以下可以得到最大的|sum(0) - sum(1)| = j + k,所以j+k <= K,最后考虑当前i放0或1就可以转移状态了。

#include 
using namespace std;typedef long long ll;ll dp[66][7][7];int main() { int N, K; while (scanf ("%d%d", &N, &K) == 2) { memset (dp, 0, sizeof (dp)); dp[0][0][0] = 1; for (int i=1; i<=N; ++i) { for (int j=0; j<=K; ++j) { for (int k=0; k<=K; ++k) { if (j + k > K) continue; dp[i][max (j-1, 0)][k+1] += dp[i-1][j][k]; dp[i][j+1][max (k-1, 0)] += dp[i-1][j][k]; } } } ll ans = 0; for (int i=0; i<=K; ++i) { for (int j=0; j<=K; ++j) { if (i + j > K) continue; ans += dp[N][i][j]; } } printf ("%lld\n", ans); } return 0;}

  

转载于:https://www.cnblogs.com/Running-Time/p/5286949.html

你可能感兴趣的文章
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
js编码
查看>>
Pycharm Error loading package list:Status: 403错误解决方法
查看>>
steps/train_sat.sh
查看>>
转:Linux设备树(Device Tree)机制
查看>>