题目链接:https://ac.nowcoder.com/acm/contest/375/A
思路:
考虑先选择三个数,选择最后一个数时只需要满足选择的数大于选择的第二个数就可以,可以用dp来处理:dp[ i ][ j ]表示在数组下标i及以后出现大于j的数字的个数
代码:#include<iostream>
using namespace std;
typedef long long ll;
ll num[509];
ll dp[509][509];
int main(){
ll n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>num[i];
}
for(int i=n;i>=1;i--){
int flag=num[i]-1;
if(i==n){
for(int j=509;j>=1;j--)
if(flag>=j) dp[i][j]++;
}else{
for(int j=509;j>=1;j--){
dp[i][j]=dp[i+1][j];
if(flag>=j) dp[i][j]++;
}
}
}
ll ans=0;
for(int i=1;i<=n-3;i++){
for(int j=i+1;j<=n-2;j++){
if(num[i]<num[j])
for(int k=j+1;k<=n-1;k++){
if(num[j]>num[k]&&num[k]>num[i]){
//cout<<num[i]<<" "<<num[j]<<" "<<num[k]<<endl;
ans+=dp[k+1][num[j]];
}
}
}
}
cout<<ans<<endl;
}