HDU 1502 Regular Words

不问归期 提交于 2019-12-01 18:44:05

这题是动态规划,需要:打表,字符数组,动态规划。

状态表示:dp[i][j][k]表示的是有i个A,j个B和k个C满足要求的有多少种

转移方程:dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1]

边界:dp[0][0][0]=1;

因为会暴int,暴long long所以转换成字符数组来操作

 

#include<bits/stdc++.h>
using namespace std;
int n;
char dp[65][65][65][110];
void add(int i,int j,int k)
{
    for(int l=1;l<=100;l++)
    {
        if(i-1 >= j && j >= k &&i-1>=0&&dp[i-1][j][k][l]!=0)
            dp[i][j][k][l] += dp[i-1][j][k][l];
        if(i >= j-1 && j-1 >= k &&j-1>=0&&dp[i][j-1][k][l]!=0)
            dp[i][j][k][l] += dp[i][j-1][k][l];
        if(i >= j && j >= k-1 &&k-1>=0&&dp[i][j][k-1][l]!=0)
            dp[i][j][k][l] += dp[i][j][k-1][l];
    }
    for(int l=1;l<=100;l++)
    {
        int temp=dp[i][j][k][l]/10;
        dp[i][j][k][l+1]+=temp;
        dp[i][j][k][l]%=10;
    }
}
int main()
{
    dp[0][0][0][1]=1;
    for(int i=0;i<=60;i++)
        for(int j=0;j<=60;j++)
            for(int k=0;k<=60;k++)
                if(i>=j&&j>=k&&i+j+k)
                    add(i,j,k);
    while(~scanf("%d",&n))
    {
        int flag=0;
        for(int i=100;i>=1;i--)
        {
            if(dp[n][n][n][i]) flag=1;
            if(flag)
                printf("%c",dp[n][n][n][i]+'0');
        }
        printf("\n\n");
    }
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!