/*
给定r个红块,g个绿块,按要求堆放
问当堆放成最大高度时,有多少种可能的堆放方式
排列要求:1.第i行放i块
2.每行同色 首先当然要确定能够放置几行
设红块有r个,绿块有g个,那么放置h行需要(h+1)h/2个
那么r+g>=(h+1)h/2 => 2(r+g)>=(h+1)h => 2(r+g)>h*h
那么有 h=sqrt(2r+2g),然后再找符合条件的h 然后确定状态:dp[i][j]表示前i行用了j个红块的排列方案
转移方程:外层循环枚举i表示第i层,内层循环枚举j表示红块使用数
dp[i][j]=dp[i-1][j]+dp[i-1][j-i],即该行不用红块和用红块的两种决策
决策合法性:当j<i时这层只能用绿块
同时第i层红块至少用max(i(i+1)/2-g,0)个
初始状态,dp=0,r>0,dp[1][1]=1,g>0,dp[1][0]=1
用滚动数组优化
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll ans,h,dp[],r,g;
#define mod 1000000007
int main(){
cin>>r>>g;
h=sqrt(*r+*g);
while(h*(h+)/>(r+g))h--;
if(r>)dp[]=;
if(g>)dp[]=;
for(int i=;i<=h;i++){
int l=max((ll),(i+)*i/-g);
for(int j=r;j>=l;j--){
if(j>=i)dp[j]=(dp[j]+dp[j-i])%mod;
else dp[j]=dp[j];//只能用绿块
}
}
int l=max((ll),(h+)*h/-g);
for(int i=r;i>=l;i--)
ans=(ans+dp[i])%mod;
cout<<ans<<endl;
}

cf478d 线性dp好题的更多相关文章

  1. poj2018 二分+线性dp好题

    /* 遇到求最值,且答案显然具有单调性,即可用二分答案进行判定 那么本题要求最大的平均数,就可以转换成是否存在一个平均数为mid的段 */ #include<iostream> #incl ...

  2. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

  3. 单调队列+线性dp题Watching Fireworks is Fun (CF372C)

    一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...

  4. cf909C 线性dp+滚动数组好题!

    一开始一直以为是区间dp.. /* f下面必须有一个s 其余的s可以和任意f进行匹配 所以用线性dp来做 先预处理一下: fffssfsfs==>3 0 1 1 dp[i][j] 表示第i行缩进 ...

  5. [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题

    题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...

  6. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  7. 动态规划_线性dp

    https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...

  8. 线性dp

    线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...

  9. CH 5102 Mobile Service(线性DP)

    CH 5102 Mobile Service \(solution:\) 这道题很容易想到DP,因为题目里已经说了要按顺序完成这些请求.所以我们可以线性DP,但是这一题的状态不是很好设,因为数据范围有 ...

随机推荐

  1. pwnable.kr col

    collision - 3 pt 连接上查看col.c源码 分析一下代码, 1.hashcode等于一个固定的值 2.check_password函数取输入数据,4个一组,将输入的字符转成int,然后 ...

  2. apk逆向实例 TopCtf

    TopCtf 题目链接: https://pan.baidu.com/s/1jINx7Fo   (在里面找相应的名字就行) 背景故事: 我是小白一枚,自学一些基础知识... 从朋友那得到的题,朋友说巨 ...

  3. windows 10下sublime text3环境的搭建以及配置python开发环境

    1 - 安装Sublime Text 3 到官网下载对应的版本,如下: OS X (10.7 or later is required) Windows - also available as a p ...

  4. MyBatis-进阶1

    接入门的实例,我们知道MyBatis可以使用注解和配置文件实现接口和sql语句的绑定. 那么一个接口方法同时使用注解和xml配置会怎么样. @Select("select * from us ...

  5. mac 电脑连接linux 服务器

    Mac 电脑下连接Linux服务器 命令: ssh -p 端口号(22) 用户名@ip OK,输入密码,搞定

  6. css干货部分

    1.css的引入方式(三种): a.行内样式<div> <p style="color: green">我是一个段落</p> </div& ...

  7. vc++基础班[27]---实现一个简单的任务管理器

      因为任务管理器中涉及到进程的枚举操作,所以把两节课的知识点合并到一起来讲!   ①.设计界面.以及列表控件变量的绑定: ②.列表控件样式的指定: m_TaskList.SetExtendedSty ...

  8. Efuse--芯片存储

    1.Efuse是什么 Efuse类似于EEPROM,是一次性可编程存储器,在芯片出场之前会被写入信息,在一个芯片中,efuse的容量通常很小,一些芯片efuse只有128bit. 2.efuse的作用 ...

  9. hibernate框架学习之数据抓取(加载)策略

    Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...

  10. Ubuntu 关闭触摸板

    1.关闭 sudo modporbe -r psmouse 2.开启 sudo modprobe psmouse