大数DP


HDU 1502

利用大数运算寻找字符A>=B>=C的数量

#include <iostream>
#include <cstring>
using namespace std;
const int N=123;
int dp[N][N][N][N];
int cnt=2;
int main() {
    int n;
    dp[0][0][0][1]=1;
    for(int i=1;i<=60;i++) {
        for(int j=0;j<=i;j++) {
            for(int k=0;k<=j;k++) {
                for(int p=1;p<cnt;p++) {
                    dp[i][j][k][p]+=dp[i-1][j][k][p];
                    if(j>0) dp[i][j][k][p]+=dp[i][j-1][k][p];
                    if(k>0) dp[i][j][k][p]+=dp[i][j][k-1][p];
                    dp[i][j][k][p+1]+=dp[i][j][k][p]/10;
                    dp[i][j][k][p]%=10;                    
                }
                while(dp[i][j][k][cnt]) {
                    dp[i][j][k][cnt+1]+=dp[i][j][k][cnt]/10;
                    dp[i][j][k][cnt]%=10;
                    cnt++;
                }
                if(i==j && j==k) {
                    dp[i][j][k][0]=cnt;
                }
            }
        }
    }
    while(~scanf("%d",&n)) {
        for(int i=dp[n][n][n][0]-1;i>=1;i--) {
            cout<<dp[n][n][n][i];
        }
        printf("\n\n");
    }
    return 0;
}

文章作者: HLW
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HLW !
评论
  目录