Java

Owll 发表于 1年前 · 关联问题

题目:

思路:动态规划

  1. 考虑某一长度n的字符串,符合条件的字符串可以是在长度为n-1的合法字符串后面加上'a'-'z',即dp[n]=dp[n-1]*26。
  2. 长度为n的合法字符串还可以是长度为n-1,不包含子序列'us',但包含字符'u'的字符串后面加上's'

代码如下:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; public class Main { //快速输入 static BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //快速输出 static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out)); public static void main(String[] args) throws IOException { String[] s=br.readLine().split(" "); int n=Integer.parseInt(s[0]); int p=(int) (Math.pow(10, 9)+7); //dp[i][0]表示长度为i,不包含子序列'us'的字符串数量 //dp[i][1]表示长度为i,不包含子序列'us',但包含字符'u'的字符串数量 //dp[i][2]表示长度为i,包含子序列'us',的字符串数量 long[][] dp=new long[n+1][3]; dp[1][0]=25; dp[1][1]=1; long ans=0; for(int i=2;i<=n;i++) { dp[i][0]=(dp[i-1][0]*25l)%p; dp[i][1]=(dp[i-1][0]+dp[i-1][1]*25l)%p; dp[i][2]=(dp[i-1][2]*26l+dp[i-1][1])%p; //题目要求的是长度不超过n的合法字符串数量之和,所以要将所有不同长度的合法字符串数量加上 ans=(ans+dp[i][2])%p; } pw.println(ans); pw.flush(); } }