【【henuacm2016級暑期訓練】動態規劃專題 J】Red-Green Towers
阿新 • • 發佈:2018-07-16
cin 使用 space open ble .net long clu 不用
【鏈接】 我是鏈接,點我呀:)
【題意】
在這裏輸入題意
【題解】
顯然最多1000行的樣子。
從上到小做dp
設f[i][j]為前i行,使用了j個紅色方塊的方案數。
f[1][r] = 1;如果r>0且g>0則f[1][r-1]=1;
然後如果第i+1行不用紅色的話。->就只能用綠色了。。
算算綠色夠不夠填i+1個。。
夠得話
f[i+1][j] = f[i+1][j] + f[i][j];
然後看看紅色夠不夠填i+1個
夠得話
還可以用紅色填i+1行
也即
f[i+1][j-(i+1)] = f[i+1][j-(i+1)]+ f[i][j];
最後取∑f[h][0..r];
加一個滾動數組搞。。
但感覺時間很玄學啊。都2個億的復雜度了。。
【代碼】
#include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define all(x) x.begin(),x.end() #define pb push_back #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace std; const double pi = acos(-1); const int dx[4] = {0,0,1,-1}; const int dy[4] = {1,-1,0,0}; const int MOD = 1e9+7; const int N = 2000; const int R = 3e5; int r,g,f[2][R+10],h,cur[N+10]; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0); cin >> r >> g; cur[1] = 1; h = 1; for (int i = 2;;i++){ cur[i] = cur[i-1] + i; if (cur[i]>(r+g)) break; h = i; } f[1][r] = 1;if (r>0 && g > 0)f[1][r-1] = 1; for (int i = 1;i <= h-1;i++){ memset(f[(i+1)&1],0,sizeof f[(i+1)&1]); for (int j = 0;j <= r;j++){ //前i層,剩余紅色磚塊個數為j的方案數 if (f[i&1][j]==0) continue; int green_available = g-(cur[i]-(r-j)); if (green_available>=(i+1)) f[(i+1)&1][j] = (f[(i+1)&1][j] + f[i&1][j])%MOD; if (j>=(i+1)) f[(i+1)&1][j-(i+1)] = (f[(i+1)&1][j-(i+1)]+ f[i&1][j])%MOD; } } int ans = 0; for (int i = 0;i <= r;i++){ ans = (ans + f[h&1][i])%MOD; } cout<<ans<<endl; return 0; }
【【henuacm2016級暑期訓練】動態規劃專題 J】Red-Green Towers