similar ques
https://leetcode.com/problems/dice-roll-simulation/
Solution in max 50 * 6 * N time for 1st question using dynamic programming, dp[d][i] gives the number of sequences that in the last i rolls we have dice=d, and the previous one was not d, so the run's length was exactly "i".
int rollDice(int N,vector<int> rollMax){
if(N==0)return 1;
#define M 1000000007
vector<vector<int>>dp(6);
for(int i=0;i<6;i++){
dp[i]=vector<int>(rollMax[i]+2,0);
dp[i][1]=1;
}
for(int numroll=2;numroll<=N;numroll++){
int total=0;
int p_sum[6];
for(int d=0;d<6;d++){
int partsum=0;
for(int i=0;i<=rollMax[d];i++)partsum=(partsum+dp[d][i])%M;
p_sum[d]=partsum;
total=(total+partsum)%M;
}
for(int d=0;d<6;d++){
for(int i=rollMax[d];i>1;i--)dp[d][i]=dp[d][i-1];
int res=(total-p_sum[d])%M;
if(res<0)res+=M;
dp[d][1]=res;
}
}
int ans=0;
for(int d=0;d<6;d++)for(int i=1;i<=rollMax[d];i++)ans=(ans+dp[d][i])%M;
return ans;
}
int main(void){
cout<<rollDice(2,{1,2,1,2,1,2})<<endl;
cout<<rollDice(3,{1,1,1,1,1,1})<<endl;
return 0;
}