https://ac.nowcoder.com/acm/contest/317/F

C++版本一

std

题解:DP

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5001, mod = 1e9 + 7;
int N, V, a[MAXN],  f[MAXN][MAXN], Lim, x[MAXN], y[MAXN], g[MAXN][MAXN];
int add(int x, int y) {
    if(x + y < 0) return x + y + mod;
    return x + y >= mod ? x + y - mod : x + y;
}
void add2(int &x, int y) {
    if(x + y < 0) x = (x + y + mod);
    else x = (x + y >= mod ? x + y - mod : x + y);
}
int mul(int x, int y) {
    return 1ll * x * y % mod;
}
int main() {
    //freopen("a.in", "r", stdin);
    cin >> N >> V; Lim = V;
    for(int i = 1; i <= Lim; i++) g[1][i] = add(i, g[1][i - 1]), f[1][i] = 1;
    for(int x = 2; x <= N; x++) {
        for(int y = 0; y <= Lim; y++) {
            f[x][y] = 1;
            add2(f[x][y], g[x - 1][y - 1]);
            g[x][y] = add(add(add(g[x][y - 1], mul(f[x][y], y)), g[x - 1][y]), -g[x - 1][y - 1]);
        }
    }
//    cout << g[N][Lim] << endl; 
    for(int x = 1; x <= N; x++) 
        for(int y = 2; y <= Lim; y++) 
            add2(f[x][y], f[x][y - 1]);
    int ans = 0;
    for(int i = 1; i <= N; i++) add2(ans, f[i][V]);
    cout << ans;
    return 0;
}