codeforces 478D D. Red-Green Towers(dp)

题目链接:

codeforces 478D


题目大意:

给出r个红砖,g个绿砖,问有多少种方法搭成最高的塔。


题目分析:

  • 定义状态dp[i][j]表示构造i层的塔需要j块绿砖的方案数。
  • 转移方程:

    dp[i][j]=dp[i?1][j?i]+dp[i?1][j]
  • 分别代表当前这一层放绿砖还是放红砖(当然要先判断当前状态转移是否合法)

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 400007

using namespace std;

int dp[2][MAX];
int r,g;
const int mod = 1e9+7;

int cal ( int h )
{
    return h*(h+1)/2;
}

int main ( )
{
    while ( ~scanf ( "%d%d" , &r , &g ) )
    {
        memset ( dp , 0 , sizeof ( dp ) );
        dp[0][0] = 1;
        int ans = 0;
        for ( int i = 1 ;; i++ )
        {
            int x = i%2;
            int y = (i+1)%2;
            bool flag = true;
            int low = cal ( i-1 );
            int high = cal ( i );
            for ( int j = 0; j <= high ; j++ )
                dp[x][j] = 0;
            for ( int j = 0; j <= high; j++ )
            {
                int jj = high - j;
                if ( j > g || jj > r ) continue;
                if ( j >= i )
                {
                    dp[x][j] += dp[y][j-i];
                    dp[x][j] %= mod;
                }
                dp[x][j] += dp[y][j];
                dp[x][j] %= mod;
            }
            bool mark = true;
            int temp = 0;
            for ( int j = 0 ; j <= high ; j++ )
                if ( dp[x][j] )
                {
                    mark = false;
                    temp += dp[x][j];
                    temp %= mod;
                }
            if ( mark ) break;
            ans = temp;
        }
        printf ( "%d\n" , ans );
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 15:43:56

codeforces 478D D. Red-Green Towers(dp)的相关文章

CodeForces 540D Bad Luck Island 概率dp

CodeForces 540D 应该是简单概率dp,由于写得少显得十分蠢萌 求期望逆推,求概率正推,大概是这么个意思,贴一发留恋 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define db double const int maxn=108; db dp[maxn][maxn][maxn]; int main() { int i,j,n,m,k,p; whi

codeforces 148E Aragorn&#39;s Story 背包DP

Aragorn's Story Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/148/E Description Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who

CodeForces 21D Traveling Graph 状压dp+欧拉回路

题目链接:点击打开链接 题意: 给定n个点m条边的无向图 求从1点开始经过每条边至少一次最后回到1点的最小路程 显然就是找一条路径可重复的欧拉回路 思路: 首先对于欧拉回路的结论是:所有点的度数都为偶数 因为所有边至少经过一次,那么可以把题意转换成加最少多少条边使得图满足以上结论 而加的边目的是为了把奇度数转成偶度数,先floyd一下得到任意点间加边的最小花费 dp[i]表示状态i下度数都为偶数的最小花费. 状压dp,把i状态下,所有未选择的点中挑2个奇度数的转移即可. #include <cs

Codeforces 67C Sequence of Balls 编辑距离 dp

题目链接:点击打开链接 有一个交换操作比较特殊,所以记录每个点距离自己最近的那个字符的位置 然后交换就相当于把第一行要交换的2个字符 之间的字符都删掉 把第二行要交换的2个字符 之间的字符都插入第一行的2个字符之间 然后再进行交换. #include <cstdio> #include <cstring> #include<iostream> using namespace std; #define inf 10000000 #define N 4005 #define

Codeforces Round #261 (Div. 2) E (DP)

E. Pashmak and Graph Pashmak's homework is a problem about graphs. Although he always tries to do his homework completely, he can't solve this problem. As you know, he's really weak at graph theory; so try to help him in solving the problem. You are

codeforces 514E Darth Vader and Tree (dp+快速幂)

codeforces 514E Darth Vader and Tree (dp+快速幂) 题意: 有一棵树,每个节点有n个儿子,给出父亲到每个儿子的距离di,问离祖先距离不超过x的子孙有多少个(子孙包括祖先)对1e9+7取模. 限制: 1 <= n <= 1e5; 0 <= x <= 1e9; 1 <= di <= 100 思路: 因为di <= 100,所以可以用快速幂来处理这道题, 大概过程为:先用dp算出前100的答案,剩下的用快速幂来处理.

Codeforces 56D Changing a String 编辑距离 dp

题目链接:点击打开链接 编辑距离,,== 一边dp一边记录前驱太累,,还是dp后找路径大法好 #include<iostream> #include<cstdio> #include<vector> #include<string.h> using namespace std; #define ll int #define N 1010 char s[N], t[N]; int dp[N][N], n, m; // 0为插入 1为删除 2 3为替换 stru

Codeforces 455A Boredom 取数字的dp

题目链接:点击打开链接 给定一个n长的序列 删除x这个数就能获得x * x的个数 的分数,然后x+1和x-1这2个数会消失,即无法获得这2个数的分数 问最高得分. 先统计每个数出现的次数,然后dp一下,对于每个数只有取或不取2种状态. #include <algorithm> #include <cctype> #include <cassert> #include <cstdio> #include <cstring> #include <

[Codeforces 464D]World of Darkraft(期望DP)

[Codeforces 464D]World of Darkraft(期望DP) 题面 游戏中有k种装备,每种装备初始时都是等级1.zyd每打一只怪,就会随机爆出一件装备.掉落和更新装备方式如下: 假设这种装备当前等级为t,那么系统会在[1,t+1]中等概率随机出该装备的等级.爆出装备后,会装备上身上的和爆出的装备之间等级更高的那件,并卖掉等级更低的装备.其中等级为i的装备价格为i金币. 求打了n只怪后获得金币的期望值,精确到\(10^{-9}\). \(n,k\leq 10^5\) 分析 首先