数据是5e4 考虑最基本的dp 前 i 位由 j个不同的数组成有多少种 首先可以用二分先 找出那个最多的不同的数 是 350 然后我们考虑状态转移 最简单的就是 每一次新增一个 1 那么我们如何去新增一个1而使1不重复呢 我们可以把前面所有的数都先加一个 1 然后再加一个1 那么就是 dp[i - j][j - 1] 我们可以发现 前面的数全都加一个一 也是不会重复得所以 dp[i][j] = dp[i -j][j - 1] + dp[i - j][j ];
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 5e4 + 10,mod = 1e9 + 7;
int dp[N][351];
int main(){
int n;
cin >> n;
dp[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= 350; j++){
if(i >= j){
dp[i][j] = dp[i - j][j] + dp[i - j][j - 1];
dp[i][j] %= mod;
}
}
}
ll sum = 0;
for(int i = 1; i <= 350; i++){
sum += dp[n][i];
sum %= mod;
}
cout << sum <<endl;
return 0;
}