解法:
首先都可以想到dp[i]:第i个元素结尾的递增四元组有dp[i]个
然后发现有一组数据:2,3,6,1,5,8。会出现6结尾和5结尾的递增三元组,也就是未来的决策受过去影响,专业的说就是有后效性。需要强化约束条件,于是使用dp[i][j]。
第i个元素结尾的递增j元组有dp[i][j]个,显然每个元素自身就是一个一元组,dp[i][0]=1.
对于第i个元素,若存在a[k]<a[i],那么就可以把a[i]加在a[k]结尾的j元组,构成j+1元组。
迭代完善dp数组即可。
见例图:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define endl '\n'
const int N = 1e3 + 3;
int dp[N][4];
int main() {
int n; cin >> n;
vector<int> vec(n);
for (int i = 0; i < n; i++) cin >> vec[i];
for (int i = 0; i < n; i++) {
dp[i][0] = 1;
for (int j = 1; j<4; j++) {
for (int k = 0; k < i; k++) {
if (vec[i] > vec[k])
dp[i][j] += dp[k][j - 1];
}
}
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += dp[i][3];
sum %= 3344;
}
cout << sum << endl;
return 0;
}