Fabricating Sculptures dp+前綴和優化

題目鏈接: https://codeforces.com/gym/102428/problem/F

題意:

你現在有 mm 個方塊,要搭建一個以 ss 爲底的一個模型,這個模型是不能儲水的結構,即不存在一列,其左邊和右邊的倆均比它高,問你有多少種搭建的方法。

做法:

dp[i][j]dp[i][j] 表示以 ii 爲底的時候,還有 jj 個方塊時的方案數。這個時候 dp[i][j]=1dp[i][ji]+2dp[i1][ji+1]+3dp[i2][ji+2]...dp[i][j]=1*dp[i][j-i]+2*dp[i-1][j-i+1]+3*dp[i-2][j-i+2]... ,這個式子很容易得出,但是在原來我們做的時候,用記憶化搜索對於每一個 dp[i][j]dp[i][j]forfor 了一次所有的情況,所以就 TT 了,這個結構我們可以發現是 可以用兩個前綴和來維護的,一個維護 sum[i+j]sum[i+j] 的前綴和,另一個維護上面那樣,所謂前綴和的前綴和。

代碼

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;

typedef long long ll;
const int maxn=5005;
const int mod=(int)1e9+7;
int n,m;
ll sum[maxn*2],psum[maxn*2],dp[maxn][maxn];
int main() {
    scanf("%d%d",&n,&m);
    m-=n;
    for(int s=1;s<=n;s++){
        for(int res=0;res<=m;res++){
            psum[res]=(psum[res]+sum[res])%mod;
            if(res==0) dp[s][res]=1;
            else  dp[s][res]=(dp[s][res]+psum[res])%mod;
            sum[s+res]=(sum[s+res]+dp[s][res])%mod;
        }
    }
    printf("%lld\n",dp[n][m]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章