博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
各种小的 dp (精)
阅读量:6503 次
发布时间:2019-06-24

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

 

Q~ 抛一枚硬币 n 次,每次可能是正面或者反面向上,求没有连续超过 k 次硬币向上的方案数

A :

  dp[ i ] 表示到 i 位置的方案数,

  1 . 当 i < k 时, dp[i] = dp[i-1]*2

  2 . 当 i = k 时, dp[i] = dp[i-1]*2 - 1

  3. 当 i > k 时, dp[i] = dp[i-1]*2 - dp[i-k-1]

 

ll n, k;ll dp[maxn];void solve() {    dp[0] = 1;    ll res = 1;    for(ll i = 1; i <= n; i++){        if (i < k) dp[i] = dp[i-1]*2;        else if (i == k) dp[i] = dp[i-1]*2-1;        else dp[i] = dp[i-1]*2-dp[i-k-1];        dp[i] %= mod;        res *= 2; res %= mod;    }    ll ans = (res-dp[n]+mod)%mod;    printf("%lld\n", ans);}

 

 

Q~ 有三种字母, 一个长度为 n 的序列的每一个位置只可能是这三种字母,但要求连续的三个位置不能同时出现这三种,求方案数

A :

  dp[i][0] 表示 i 位置与 i-1 位置相同的方案数, dp[i][1] 表示 i 位置与 i-1 位置不同的方案数

  dp[i][0] = dp[i-1][0] + dp[i-1][1]

       dp[i][1] = 2*dp[i-1][0] + dp[i-1][1]

void solve() {    dp[1][0]=3;    dp[1][1]=0;    for(int i=2;i <= n; i++){	dp[i][0]=dp[i-1][0]+dp[i-1][1];	dp[i][1]=2*dp[i-1][0]+dp[i-1][1];    }}

 

  

 

转载于:https://www.cnblogs.com/ccut-ry/p/10065941.html

你可能感兴趣的文章
利用 squid 反向代理提高网站性能原理总结
查看>>
&& 和 || 运算符的特殊用法记录
查看>>
eruke注册中心搭建
查看>>
c++,lua交互
查看>>
Linux Shell: 统计系统中占用Swap 的程序PID和占用大小
查看>>
Java通过JNI的方式调用C
查看>>
AOSuite V3.0 发布,开源JavaEE快速开发平台
查看>>
myeclipse提示“Project must be an XFire project”
查看>>
layui 之 upload组件
查看>>
进阶Java架构师必看的15本书
查看>>
uva 400 - Unix ls
查看>>
基本数据结构之ArrayList
查看>>
Eclipse引入JRE中类提示出错
查看>>
maven命令及使用
查看>>
activity在配置只支持竖屏时要注意个问题
查看>>
EditText
查看>>
1、Spark-Streaming的原理
查看>>
关于android监视器
查看>>
驰骋BPM恭喜签订,中安金路环境工程有限公司
查看>>
Angularjs中的拦截器 使用笔记
查看>>