统计特殊子序列的数目
统计特殊子序列的数目
存在三种序列之间转换:
+ 正整数个0组成的子序列
+ 正整数个0和正整数个1组成
+ 正整数个0和正整数个1正整数个2组成 后面的序列从前面的序列转过来
class Solution {
public int countSpecialSubsequences(int[] nums) {
int MOD=1000000007;
int n=nums.length;
int[][] dp=new int[n][3];
if(nums[0]==0){
dp[0][0]=1;
}
for(int i=1;i<n;i++){
if(nums[i]==0){
dp[i][0]=((2*(dp[i-1][0]%MOD))%MOD+1)%MOD;
dp[i][1]=dp[i-1][1];dp[i][2]=dp[i-1][2];
}else if(nums[i]==1){
dp[i][1]=(2*dp[i-1][1]%MOD+dp[i-1][0]%MOD)%MOD;
dp[i][0]=dp[i-1][0];dp[i][2]=dp[i-1][2];
}else if(nums[i]==2){
dp[i][2]=(2*dp[i-1][2]%MOD+dp[i-1][1]%MOD)%MOD;
dp[i][0]=dp[i-1][0];dp[i][1]=dp[i-1][1];
}
}
return dp[n-1][2]%MOD;
}
}