博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
紫书 例题 10-13 UVa 830(递推)
阅读量:6962 次
发布时间:2019-06-27

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

首先我们按照这三个U的位置来分类,当前三个U在i,i+1, i+2。

那么先看三个U前面,前面不能有三个U,因为我们不能重复计算

那么就是所有的组合减去有U的情况

为了叙述方便,我们设答案为f(n),没有三个U的方案数为 g(n)

那么显然g(n) = 2的n次方-f(n)

然后我们看三个U后面,后面就任意了是2的(n-i-2)次方

但是这里有一个问题,就是可能第i-1个可以和i,i+1组成三个U

或者i-2与i-1,i组成三个U

那么我们就强行让第i-1个是L,就可以避免这种情况

当i-1不存在,即i=1的时候,这个时候需要特判一下

这个时候第1,2,3个为U,后面随便组,答案是2的(n-3)次方

#include
#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 31;int f[MAXN], g[MAXN];int main(){ f[0] = f[1] = f[2] = 0; g[0] = 1; g[1] = 2; g[2] = 4; REP(n, 3, MAXN) { f[n] = 1 << (n - 3); REP(i, 2, n - 1) f[n] += g[i-2] << (n - i - 2); g[n] = (1 << n) - f[n]; } int n; while(~scanf("%d", &n) && n) printf("%d\n", f[n]); return 0;}

 

转载于:https://www.cnblogs.com/sugewud/p/9819506.html

你可能感兴趣的文章
Hyper-V中的VM如何使用Pass-through Disk
查看>>
黑马程序员—Java动态代理详解
查看>>
PHP发送HEAD方法请求
查看>>
OracleHelper[.Net 连接Oracle数据库的封装类]
查看>>
.net微信公众号开发——消息与事件
查看>>
动态网站维护基本命令
查看>>
透视表提取不反复记录(2)-每一个物品的全部分类
查看>>
基于jQuery/CSS3实现拼图效果的相册插件
查看>>
【问题解决】小数点前面不显示0的问题
查看>>
ios学习笔记(二)第一个应用程序--Hello World
查看>>
Maven学习总结(四)——Maven核心概念——转载
查看>>
怎么用CIFilter给图片加上各种各样的滤镜_2
查看>>
android:关于主工程和library project
查看>>
CodeForces 2A Winner
查看>>
Window环境配置Mongodb
查看>>
制作和unity调用动态链接库dll文件
查看>>
exsi6.0远程修改密码
查看>>
Header和Cookie相关内容
查看>>
20个可能你不知道Linux网路工具
查看>>
Android 关于listView 显示不全的问题
查看>>