zoukankan      html  css  js  c++  java
  • PID38 串的记数(codevs2077)

    /*
    假设当前有a个A b个B c个C 用 f[a][b][c]来表示
    那么如果这个串以A结尾 那就是 f[a-1][b][c]转移来的 
    所以构成 f[a][b][c]的串一定有一部分是 f[a-1][b][c]
    同理 B C 所以:
    f[a][b][c] = f[a-1][b][c]+f[a][b-1][c]+f[a][b][c-1]  
    至于题目里那个什么前缀什么规则 既然f[1][1][1] 合法
    那么他转移出来的 f[1][1][2] f[1][2][1] f[2][1][1]自然也合法
    最后输出 f[n][n][n]
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int f[61][61][61][101],n;
    void add(int i,int j,int k,int a,int b,int c)
    {
        int l;
        for(l=1;l<=100;l++)
          f[i][j][k][l]=f[i][j][k][l]+f[a][b][c][l];
        for(l=1;l<=100;l++)
          if(f[i][j][k][l]>=10)
            {
              f[i][j][k][l+1]++;
              f[i][j][k][l]-=10;
            }
    }
    int main()
    {
        cin>>n;
        int i,j,k;
        f[0][0][0][1]=1;
        f[0][0][0][0]=1;
        for(i=0;i<=n;i++)
          for(j=0;j<=i;j++)
            for(k=0;k<=j;k++)
              {
                  if(i>0)
                  add(i,j,k,i-1,j,k);
                  if(j>0)
                  add(i,j,k,i,j-1,k);
                  if(k>0)
                  add(i,j,k,i,j,k-1);
              }
        for(i=100;i>=1;i--)
          if(f[n][n][n][i]>0)
            {
              k=i;break;
            }
        for(i=k;i>=1;i--)
          cout<<f[n][n][n][i];
        return 0;
    }
  • 相关阅读:
    android测试点汇总
    Java Web应用调优线程池
    大型网站架构技术一览
    如何用消息系统避免分布式事务
    VMware Tools安装
    Git
    构架分布式队列编程
    排序算法概述
    ThreadLocal使用和原理
    JVM常用参数配置
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5412928.html
Copyright © 2011-2022 走看看