题目链接:hdu 5642
模板题,甚至不用判断limit,水过~
#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#include<map>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define sqr(a) (a)*(a)
#define For(i,m,n) for(int i=m;i<=n;i++)
#define Dor(i,n,m) for(int i=n;i>=m;i--)
#define lan(a,b) memset(a,b,sizeof(a))
using namespace std;
LL a[20];
LL dp[2010][3];
LL pin(int pos,int st,int num)
{
if(pos==-1)///递归基,如果所有数位都遍历完毕,判断条件是否满足并返回
{
return 1;
}
if(dp[pos][st]!=-1) return dp[pos][st];///记忆化搜索,如果之前搜过就直接返回,前提是lim=0
LL ans=0;
int up=25;///确定上限
for(int i=0;i<=up;i++)
{
if(st==2&&i==num)
continue;
int tem;
if(num==i)
tem=st+1;
else
tem=0;
ans+=pin(pos-1,tem,i)%mod;///dp核心,状态转移
ans%=mod;
}
dp[pos][st]=ans;///如果没有限制就更新记忆化数组
return ans;
}
int main()
{
int t;
scanf("%d",&t);
lan(dp,-1);
while(t--)
{
int n;
scanf("%d",&n);
n--;
LL ans=0;
for(int i=0;i<=25;i++)
{
ans+=pin(n-1,0,i)%mod;
ans%=mod;
}
printf("%lld\n",ans);
}
return 0;
}