(我以前可能学了个假的记忆化搜索。。。)
fpos,k,cnt 表示到第 pos 个点,摆 cnt 盆 k 类花
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const int MOD = 1e6 + 7;
int n, m, a[N], dp[N][N][N];
int solve(int pos, int k, int cnt) {
#define result dp[pos][k][cnt]
if(!cnt) {
int res = 0;
for(int i = 1; i < k; i ++ )
for(int j = 1; j <= a[i]; j ++ )
res = (res + solve(pos, i, j)) % MOD;
return result = res % MOD;
}
if(pos == 1) return result = (cnt > 1 ? 0 : cnt);
if(!pos) return result = 0;
if(result) return result;
return result = solve(pos - 1, k, cnt - 1) % MOD;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
int ans = 0;
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= a[i]; j ++ )
ans = (ans + solve(m, i, j)) % MOD;
cout << ans << endl;
return 0;
}