CF273(D2)D DP

【题意】:

给出N个绿色砖头和M个红色砖头,要堆成尽量高的如下规律的建筑,其中每一行只能用一种颜色。

问有多少种堆的方法。

【知识点】:

DP 滚动数组

【题解】:

在代码中,DP[i]代表用了i个红积木所对应的堆积种类。

    REP(i, h)
        for(int j = N - i; j >= 0; j--)
            dp[i + j] = (dp[i + j] + dp[j]) % MOD;

第一层循环代表积木条的长度从小到大地放,第二层进行滚动更新。

【代码】:

#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <bitset>
#include <climits>
using namespace std;

#define wh while
#define inf (int)(~0u/2)
#define FOR(i, n) for(int i = 0; i < n; i++)
#define FOR1(i, n) for(int i = 1; i < n; i++)
#define FOR2(i, n) for(int i = 0; i <= n; i++)
#define REP(i,n) for(int i = 1; i <= n; i++)
#define FORI(it,n) for(typeof(n.begin()) it = n.begin(); it != n.end(); it++)
#define sf scanf
#define pf printf
#define frs first
#define sec second
#define psh push_back
#define mkp make_pair
#define PB(x) push_back(x)
#define MP(x, y) make_pair(x, y)
#define clr(abc,z) memset(abc,z,sizeof(abc))
#define lt(v) v << 1
#define rt(v) v << 1 | 1
//#define mid ((l + r) >> 1)
#define lson l, mid, v << 1
#define rson mid + 1, r, v << 1 | 1

#define fre freopen("1.txt", "r", stdin)

typedef long long LL;
typedef long double LD;

int N, M;
const int maxn = 2e5 + 100;
const int MOD = 1000000007;
int dp[maxn];

int main() {
    sf("%d%d", &N, &M);
    int h; for(h = 1; h * (h + 1) / 2 <= (N + M); h++); h--;
    dp[0] = 1;
    REP(i, h)
        for(int j = N - i; j >= 0; j--)
            dp[i + j] = (dp[i + j] + dp[j]) % MOD;
    h = (h + 1) * h / 2; int ans; ans = 0;
    for(int j = 0; j <= N; j++)
        if(h - j <= M) ans = (ans + dp[j]) % MOD;
    pf("%d\n", ans);
}
时间: 2024-10-24 03:21:06

CF273(D2)D DP的相关文章

CF261(D2)E DP

[题意]: 给出n,m,代表n个点.及m条有向边.然后m行给出每条有向边的u,v,w(权值). 题目要求你求出最长路径的长度,是该路径满足权值严格递增. 数据范围 1 ≤ wi ≤ 10^5 [知识点]: DP [题解]: 一道看似图论的题目,其实可以利用递推的方法巧妙地解决. 因为权值的最大值为10^5,所以可以用权值表示下标,来保存边 然后遍历权值 tmp[v]表示在当前权值所在边为尾边的最大长度,用max(tmp[v], dp[u] + 1)更新 然后用tmp[v]更新dp[v],dp[v

2014多校8(1001)hdu4945(dp+组合数计数+求逆元)

2048 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 566    Accepted Submission(s): 129 Problem Description Teacher Mai is addicted to game 2048. But finally he finds it's too hard to get 2048.

Problem A: 英雄无敌3(1)【dp/待补】

Problem A: 英雄无敌3(1) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 86  Solved: 16[Submit][Status][Web Board] Description 大家知道在英雄无敌3中,每个城堡都需要钱来维持建设,现在有一座很奇怪的金矿,它在第i天只产生si 元的钱,而且如果你在第i天拿到si 元的钱,那么你将在 xi 内(包括第i天)拿不到钱,而在yi天内(包括第i天)一定要再次拿钱.现在有一个着急的玩家,他现在已

NYOJ - 括号匹配(二)(经典dp)

括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描写叙述 给你一个字符串,里面仅仅包括"(",")","[","]"四种符号,请问你须要至少加入多少个括号才干使这些括号匹配起来. 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入一个正整数N,表示測试数据组数(N<=10) 每组測试数据都仅仅有一行,是一个字符串S,S中仅仅包括以上所说的四

NYOJ15|括号匹配(二)|区间DP|Elena

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来. 如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度

DAG的运用:拓扑排序(AOV),关键路径(AOE)与dp的关系

dp在DAG中有两个运用,一个是固定终点和起点的最长路(最短路) 其中最长路的算法就是关键路径(AOE)的算法. 下面是代码 #include<cstdio> #include<algorithm> #define maxn 2001 using namespace std; int a[10],head[maxn],n,p,f[maxn],tp[maxn],de[maxn],ds[maxn]; struct ss { int to,w,last; }x[maxn*1000]; v

nyoj 括号匹配(二) 【DP】

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来. 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10) 每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符

ACM之路(16)—— 数位DP

题目就是kuangbin的数位DP. 先讲C题,不要62,差不多就是一个模板题.要注意的是按位来的话,光一个pos是不够的,还需要一维来记录当前位置是什么数字,这样才能防止同一个pos不同数字的dp值混在一起.直接丢代码: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <iostream> 5 #include <vector> 6 #in

石头剪刀步(rps):dp,概率&amp;期望

既然已经给std了,直接扔代码啦.代码注释还是不错哒. 因为我也有点懵,不明白的或有不同见解的一定要在评论区喷我啊! 1 #include<bits/stdc++.h> 2 using namespace std; 3 //首先题意可能还有人理解错了.题目的意思是你要根据对手分别出了几个石头几个剪刀来决策 4 //而并不是一场战斗结束后你就能知道对方具体是谁从而直接推断剩下的人 5 #define g f[i][j][k]//压行,和那个题解里的含义不一样,但没有影响 6 #define d(