版权声明:最后一年,加油~ https://blog.csdn.net/zzti_xiaowei/article/details/86633512
[好评]
简单的dp题目,类似于hdu一道滑稽树上掉滑稽果,求人在滑稽树下移动接到最多滑稽果的数量。只是这道题题意没有那么显然,dp菜菜,想了好久~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int Max_n=1e6+10;
const ll mod=1e9+7;
int n,l,r;
ll dp[Max_n][3];
int main()
{
scanf("%d%d%d",&n,&l,&r);
ll a,b,c;
// a=b=c=(r-l+1)/3;
// for(int i=0;i<(r-l+1)%3;i++){
// if((l+i)%3==0)a++;
// else if((l+i)%3==1)b++;
// else c++;
// }
// cout<<a<<b<<c<<endl;
// 数位dp中的思想求区间内满足条件的数f(l,r)<=>f(r)-f(l-1)
a=r/3-(l-1)/3;
b=(r+2)/3-(l+1)/3;
c=(r+1)/3-l/3;
dp[1][0]=a;dp[1][1]=b;dp[1][2]=c;
for(int i=2;i<=n;i++){
dp[i][0]=(dp[i-1][0]*a+dp[i-1][1]*c+dp[i-1][2]*b)%mod;
dp[i][1]=(dp[i-1][0]*b+dp[i-1][1]*a+dp[i-1][2]*c)%mod;
dp[i][2]=(dp[i-1][0]*c+dp[i-1][1]*b+dp[i-1][2]*a)%mod;
// cout<<dp[i][0]<<dp[i][1]<<dp[i][2]<<endl;
}
cout<<dp[n][0]<<endl;
return 0;
}