UVa 580 - Critical Mass(递推)
链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=521
题意:
有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够多。
要求把n(n≤30)个盒子放成一行,但至少有3个U放在一起,有多少种放法?
例如,n=4, 5时答案分别为3, 8。
分析:
设答案为f(n)。既然有3个U放在一起,可以根据“最左边的3个U”的位置分类。假定是i、i+1和i+2这3个盒子,
则前i-1个盒子不能有3个U放在一起的情况。设n个盒子“没有3个U放在一起”的方案数为g(n)=2^n-f(n),
则前i-1个盒子的方案有g(i-1)种。后面的n-i-2个盒子可以随便选择,有2^(n-i-2)种。
但是,即使前i-1个盒子内部不出现3个U,仍然可能和i、i+1和i+2组成3个U。
所以强制让第i-1个盒子(如果存在)放L,则前i-2个盒子内部不能出现连续的3个U。
因此f(n)=2^(n-3) + sum( g(i-2) * 2^(n-i-2) ), 2≤i≤n-2。
边界是f(0)=f(1)=f(2)=0。g(0)=1,g(1)=2,g(2)=4。注意上式中的2^(n-3)对应于i=1的情况。
代码:
import java.io.*;
import java.util.*; public class Main {
static final int UP = 30 + 5;
static int f[] = new int[UP], g[] = new int[UP]; static void constant() {
f[0] = 0; f[1] = 0; f[2] = 0; f[3] = 1;
g[0] = 1; g[1] = 2; g[2] = 4; g[3] = 7;
for(int n = 4; n <= 30; n++) {
f[n] = 1 << (n-3);
for(int i = 2; i <= n-2; i++) f[n] += g[i-2] * (1 << (n-i-2));
g[n] = (1 << n) - f[n];
}
} public static void main(String args[]) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
constant(); while(true) {
int n = cin.nextInt();
if(n == 0) break;
System.out.println(f[n]);
}
cin.close();
}
}
UVa 580 - Critical Mass(递推)的更多相关文章
- UVA 580 Critical Mass
https://vjudge.net/problem/UVA-580 题意:一堆U和L,用n个排成一排,问至少有3个U放在一起的方案数 f[i] 表示 至少有3个U放在一起的方案数 g[i] 表示没有 ...
- UVA 580 Critical Mass (两次dp)
题意:一个字符串有n个位置每个位置只可能是L或者U,问你在所有可能出现的字符串中最少出现一次三个U连在一起的字符串的个数 题解:首先从左向右枚举每个位置i,保证i,i+1,i+2是U,并且i+2(不包 ...
- UVa 12034 - Race(递推 + 杨辉三角)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 10288 - Coupons(概率递推)
UVA 10288 - Coupons option=com_onlinejudge&Itemid=8&page=show_problem&category=482&p ...
- uva 11375 Matches (递推)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVa 10561 (SG函数 递推) Treblecross
如果已经有三个相邻的X,则先手已经输了. 如果有两个相邻的X或者两个X相隔一个.,那么先手一定胜. 除去上面两种情况,每个X周围两个格子不能再放X了,因为放完之后,对手下一轮再放一个就输了. 最后当“ ...
- UVA 557 - Burger(概率 递推)
Burger When Mr. and Mrs. Clinton's twin sons Ben and Bill had their tenth birthday, the party was ...
- UVA 11021 Tribles(递推+概率)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33059 [思路] 递推+概率. 设f[i]表示一只Tribble经 ...
- UVa 12034 Race (递推+组合数学)
题意:A,B两个人比赛,名次有三种情况(并列第一,AB,BA).输入n,求n个人比赛时最后名次的可能数. 析:本来以为是数学题,排列组合,后来怎么想也不对.原来这是一个递推... 设n个人时答案为f( ...
随机推荐
- 新建文件可选类型插件:SublimeTmpl
介绍:SublimeTmpl,新建文件可选类型.编辑模版在:SublimeTmpl\templates"文件夹修改 1.安装: 通过 Package Control Package Cont ...
- vue中echarts引入中国地图
<div id="myChartChina" :style="{width: '100%', height: '500px'}"></div& ...
- 文档转换为pdf格式帮助类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Word = M ...
- tomcat中文请求乱码问题
使用tomcat做服务时,如果发送的url请求中包含中文字符,可能会出现乱码问题:
- mycat核心概念
一.逻辑库(schema) 业务人员一般是不需要知道数据库中间件的,他们只需要连接到数据库并使用数据库,一切复杂的细节都被中间件给隐藏了,对于业务人员来说中间件即是一个数据库.这里逻辑库的概念就是一个 ...
- Java 基础(2)——编译运行 & 规范
上节学到 Java 的编译与运行,我们已经学会了怎么去执行一个写好(假装我们已经会写了)的代码,这篇当然要试试手啦 O(∩_∩)O 哈哈~ 小试一下 新建一个 HelloAhanWhite.java ...
- Effective C++ .07 virtual析构函数的提供
主要讲了, 1. virtual析构函数的作用与调用顺序 2. 使用时机,并不是使用了继承就要把基类的析构函数变为虚函数(virtual),只有当用于多态目的时才进行一个virtual析构函数的定义. ...
- mysql case when的使用
SELECT (CASE payType WHEN 1 THEN '微信' WHEN 2 THEN '支付宝' ELSE '余额' END) as type, count(payType) FROM ...
- JavaScript switch语句
JavaScriptswitch语句 switch语句用于基于不同的条件来执行不同的动作. JavaScript switch 语句 使用switch语句可以进行多项选择. 语法: switch( 变 ...
- Js事件监听封装(支持匿名函数)
先看demo:http://liutian1937.github.io/demo/EventListen.html/*绑定事件与取消绑定*/ var handleHash = {}; var bind ...