数据范围很敏感,给的10000,很适合跑常数小的n^2算法,在加上最后的答案很大,肯定不能枚举每一种答案的具体状态,所以很容易想到用动态规划来解决。
动态规划:
f[i]: 1~i中 已经划分好的所有合法方案的数量
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
typedef pair<int,int>pii;
const int mod = 1e9 + 7 , INF = 0x3f3f3f3f , N = 1e4 + 10;
int a[N];
int f[N];
int main()
{
int n;
cin >> n;
for (int i = 1 ; i <= n ; i ++)
cin >> a[i];
f[0] = 1;
for (int i = 1 ; i <= n ; i ++)
{
int minv = a[i];
int maxv = a[i];
for (int j = i; j >= 1 ; j --)
{
minv = min(minv,a[j]);
maxv = max(maxv,a[j]);
if (i - j == maxv - minv)
f[i] = (f[i] + f[j - 1]) % mod;
}
}
cout << f[n];
}