小易的字典(很经典哦)
关键点
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); } }
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/11254831.html

浙公网安备 33010602011771号