小易的字典(很经典哦)

https://www.nowcoder.com/practice/12b1b8ef17e1441f86f322b250bff4c0?tpId=98&tqId=32838&tPage=1&rp=1&ru=/ta/2019test&qru=/ta/2019test/question-ranking

关键点

1.n个'z'和m个‘a’组成的组合数的关系

dp[i][j]=dp[i-1][j]+dp[i][j-1]

2.关于找第几个的问题,递归

固定右边x位,从m-1个z开始固定,a的个数逐渐增加

刚好没有进入下一层递归,就应该是aaazz..zzaaa这种形式

如果不是k不是刚好减去就应该是aa...aazxxxxx后面就进入xxxx里面再做一层递归

import java.util.*;
public class Main {
    StringBuilder sb=new StringBuilder();
    public static void main(String[] args) {
           Scanner sc=new Scanner(System.in);
           int n=sc.nextInt();
           int m=sc.nextInt();
           int k=sc.nextInt();  
           long[][] dp=new long[101][101]; //dp[i][j]i个'a'和j个'b'的组合数
           for(int i=0;i<101;i++)
               dp[i][0]=1;
           for(int j=1;j<101;j++)
               dp[0][j]=1;
           for(int i=1;i<101;i++) {
               for(int j=1;j<101;j++) {               
                   dp[i][j]=dp[i-1][j]+dp[i][j-1];                                                      
               }
           }    
           System.out.println(dp[n][m]);
           if(dp[n][m]<k)
           {
               System.out.println("-1");
               return;
           }
           Main main=new Main();
           StringBuilder sb=new StringBuilder();
           main.solve(n, m, k, sb, dp);          
    }
    
    public void solve(int a,int z,int k,StringBuilder sb,long[][] dp) {
        if(a==0) {
            for(int i=0;i<z;i++) sb.append("z");
            System.out.println(sb.toString());
            return;
        }
        if(z==0) {
            for(int i=0;i<a;i++) sb.append("a");
            System.out.println(sb.toString());
            return;
        }
        int la=0,lz=z-1;
        while(k-dp[la][lz]>=0)
        {
            k-=dp[la][lz];
            la++;
        }
        if(k==0)
        {
            for(int i=0;i<a-la+1;i++) sb.append("a");
            for(int i=0;i<z;i++) sb.append("z");
            for(int i=0;i<la-1;i++) sb.append("a");
            System.out.println(sb.toString());
            return;
        }
        for(int i=0;i<a-la;i++) sb.append("a");
        sb.append("z");
        solve(la,lz,k,sb,dp);
    }
}

 

 

posted @ 2019-07-27 14:04  LeeJuly  阅读(338)  评论(0)    收藏  举报