lightoj 1122 - Digit Count 简单DP

给定m个数字(范围1-9)和一个n,问能组成一个n位且相邻两位数字差值小于2的数字有多少个?

当然看完题就愣了,因为前面的题很难啊...难道是数位DP?

按捺下怀疑的心情写完AC心情很复杂...

dp[i][j]代表排好了前i位最后一位是第j个数字有多少种方法,所以对于下一个数字的添加,要判断和最后一位数字差值是否小于2...

三重循环,范围只有10嘛...

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
int dp[12][12];
int num[12];
int main()
{
    int t;
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++)
    {
        int m,n;
        scanf("%d %d",&m,&n);
        for(int i=1;i<=m;i++)
            scanf("%d",&num[i]);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=m;i++)
        {
            dp[1][i]=1;
        }
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                for(int k=1;k<=m;k++)
                {
                    if(abs(num[j]-num[k])<=2)
                        dp[i][j]+=dp[i-1][k];
                }
            }
        }
        int ans=0;
        for(int i=1;i<=m;i++)
            ans+=dp[n][i];
        printf("Case %d: %d\n",cas,ans);
    }
    return 0;
}


你可能感兴趣的:(dp,lightoj)