题目:
1214. 波动数列 - AcWing题库
思路:dp
dp=划分+递归
转自:
AcWing 1214. 波动数列(有公式详细推导) - AcWing
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010,MOD = 100000007;
int f[N][N]; //设f[i][j]为前i个数的总和模n余数为j的集合数
int get_mod(int a,int b) //求a除以b的正余数
{
return (a%b+b) % b;
}
int main()
{
int n,s,a,b;
cin >> n >> s >> a >> b;
f[0][0] = 1;//递归初始化
for(int i=1; i<n; ++i){
for(int j=0; j<n; ++j){
f[i][j] = ( f[i-1][get_mod(j-a*(n-i),n)] + f[i-1][get_mod(j+b*(n-i),n)] ) % MOD;
}
}
cout<<f[n-1][get_mod(s,n)]<<endl;
return 0;
}