codeforces 478D D. Red-Green Towers(dp)
2015-10-02 10:01
525 查看
题目链接:
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 ); } }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- 01背包问题