UVA 580 Critical Mass

https://vjudge.net/problem/UVA-580

题意:一堆U和L,用n个排成一排,问至少有3个U放在一起的方案数

f[i] 表示 至少有3个U放在一起的方案数

g[i] 表示没有3个U放在一起的方案数

状态转移:

g[i]=2^i-f[i]

枚举 第一次出现3个U的位置j,那么j-1一定是L,前j-2个一定没有3个U放在一起,第j+2个往后随便放

所以 f[i]=2^(i-3) + Σ g[i-2]*2^(i-j-2)

2^(i-3) 是当i=1时,后面的Σ从2开始

#include<cstdio>
#include<cmath>
using namespace std;
int g[31],f[31];
int main()
{
    int n;
    g[0]=1; g[1]=2; g[2]=4;
    while(scanf("%d",&n)!=EOF)
    {
        if(!n) return 0;
        if(n<=2) { printf("0\n"); continue; }
        for(int i=3;i<=n;i++)
        {
            f[i]=pow(2,i-3);
            for(int j=2;j<=i-2;j++) f[i]+=g[j-2]*pow(2,i-j-2);
            g[i]=pow(2,i)-f[i];
        }
        printf("%d\n",f[n]);
    }
}
时间: 2024-10-24 23:28:15

UVA 580 Critical Mass的相关文章

UVA 580 - Critical Mass(DP)

题目链接:580 - Critical Mass 题意:一个栈,里面可以放L和U,有三个连续的U就是不安全的,问共有几种不安全的情况 思路:dp,dp[i][j][k],表示放到第i个,最后两个状态为j,k表示有没有出现不安全.然后去记忆化搜索一下就可以了 然后还有一种做法是,先考虑安全的情况,在用总情况(1<<n 种)减去安全的情况,安全的情况的递推方式很容易dp[i]表示放第i个, dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]. 不过这题都没给数据范围

uva 580 - Critical Mass(dp)

题目链接:uva 580 - Critical Mass 题目大意:给定一个栈,向栈里连续添加n次,每次可以添加U或者L,如果出现连续三个U则为不安全,问有多少种不安全的可能. 解题思路:先求出安全的,用总数减去安全的即为答案. dp[i][j]表示以第i个位置结尾时,有末尾有j个连续的U. 还有一种解法,dp[i]表示第i个位置以L结尾的总数,dp[i] = dp[i-1] + dp[i-2] + dp[i-3]; 解法一: #include <cstdio> #include <cs

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"

uva 580 Critical Mass(递推)

#include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> using namespace std; typedef unsigned long long ull; int main() { int i,j,n; ull f[35],a[35],g[35]; a[0]=1; for(i=1;i<=30;i++) { a[i]=a[i-1]*2; } f[0]=f

UVa 1586 Molar mass --- 水题

UVa 1586 题目大意:给出一种物质的分子式(不带括号),求分子量.本题中分子式只包含4种原子,分别为C.H.O.N, 原子量分别为12.01,1.008,16.00,14.01 解题思路:先实现一个从字符型的数到整型的数的转换函数,再将输入的串从头到尾扫描,遇到字母,则进一步扫描后面的数字的区间, 再调用函数进行转换,再乘以其的原子质量,最后累加到sum中即可. /* UVa 1586 Molar mass --- 水题 */ #include <cstdio> #include <

uva 1586 - Molar mass

在想更好的处理方法,现在却只能有这个糟烂的代码了--不好意思 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int maxn=200; char s[maxn]; double ans[maxn]; int get_num(int pos,int len) { int temp; for(int i=pos;i<len;i++) { if(s[i

uva 580 危险的组合(排列组合)

Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description During the early stages of the Manhattan Project, the dangers of the new radioctive materials were not widely known. Vast new factory cities were buil

【UVA】580-Critical Mass

根据递推公式计算,需要打表不然可能会超时. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #include<list> #includ

UVa 580 (递推) Critical Mass

题意: 有两种盒子分别装有铀(U)和铅(L),现在把n个盒子排成一列(两种盒子均足够多),而且要求至少有3个铀放在一起,问有多少种排放方法. 分析: n个盒子排成一列,共有2n中方案,设其中符合要求的为f(n)种. f(n)可由下面两种情况递推出来: 前n-1个盒子的摆放满足要求,则第n个盒子可以摆放U也可以摆放L,共有2×f(n-1)中方案 前n-1个盒子不满足要求,要使前n个盒子满足要求,则第n-2.n-1.n个盒子一定是U.又因为前面的假设,所以第n-3个盒子一定是L(否则前n-1个盒子满