博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 478D D. Red-Green Towers(dp)
阅读量:3714 次
发布时间:2019-05-21

本文共 1496 字,大约阅读时间需要 4 分钟。

题目链接:


题目大意:

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


题目分析:

  • 定义状态dp[i][j]表示构造i层的塔需要j块绿砖的方案数。
  • 转移方程:
    dp[i][j]=dp[i1][ji]+dp[i1][j]
  • 分别代表当前这一层放绿砖还是放红砖(当然要先判断当前状态转移是否合法)

AC代码:

#include 
#include
#include
#include
#define MAX 400007using 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 ); }}

转载地址:http://oqvjn.baihongyu.com/

你可能感兴趣的文章
几种图像处理库的研究
查看>>
图象的骨架提取算法
查看>>
NAT原理与NAT穿透
查看>>
C语言——学生成绩管理系统
查看>>
二分法查数字
查看>>
Git的安装和Github的使用
查看>>
五子棋
查看>>
插入排序
查看>>
litepal
查看>>
铁轨(Rails,UVa 514)
查看>>
矩阵链乘 Matrix Chain Multiplication Uva442
查看>>
Fence Repair(修理栅栏 POJ 3253 普通方法和优先队列解决法)
查看>>
第十一届蓝桥杯大赛第二次模拟(软件类)真题
查看>>
Linux 编译环境 之 编译安装世界上最好的语言PHP
查看>>
解决Eclipse部署Web项目在Tomcat Webapps 目录中找不到
查看>>
解决将Editplus添加到鼠标右键的问题
查看>>
编译原理:语法分析实验(LR分析法)
查看>>
栈的链式存储结构(带头结点的单链表实现)
查看>>
十进制数转为二进制(java实现)
查看>>
栈的应用----括号匹配问题
查看>>