题目来源:https://vjudge.net/contest/409021#problem/G
思路:dp动态规划,本题的题意是取一个数列的子数列–第一个数是1,最后一个数是3,中间的数是2,问有多少种情况。记忆化处理前面有多少个1 、2 、3,但是2要特别注意,因为2可以是多个,2前面的2,可以选也可以不选,这两种情况都要算进去。
ac代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
long long int mod=1000000007;
int main()
{
int n,x;
int dp[1000001][4];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
if(x==1)
{
dp[i][1]=(dp[i-1][1]+1)%mod;
}
else dp[i][1]=dp[i-1][1];
if(x==2)
{
dp[i][2]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][2])%mod;
}
else
{
dp[i][2]=dp[i-1][2];
}
if(x==3)
{
dp[i][3]=(dp[i-1][3]+dp[i-1][2])%mod;
}
else dp[i][3]=dp[i-1][3];
}
for(int i=1;i<=n;i++)
{
cout<<dp[i][1]<<" "<<dp[i][2]<<" "<<dp[i][3]<<endl;
}
printf("%d\n",dp[n][3]);
return 0;
}