題目鏈接: https://codeforces.com/gym/102428/problem/F
題意:
你現在有 個方塊,要搭建一個以 爲底的一個模型,這個模型是不能儲水的結構,即不存在一列,其左邊和右邊的倆均比它高,問你有多少種搭建的方法。
做法:
表示以 爲底的時候,還有 個方塊時的方案數。這個時候 ,這個式子很容易得出,但是在原來我們做的時候,用記憶化搜索對於每一個 均 了一次所有的情況,所以就 了,這個結構我們可以發現是 可以用兩個前綴和來維護的,一個維護 的前綴和,另一個維護上面那樣,所謂前綴和的前綴和。
代碼
#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;
}