Java

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

题目:Nico 和 niconiconi

思路:动态规划

  1. 例如字符串"niconico"的总分d["niconico"]可以看作(d["niconic"]+d["o"],d["niconi"]+d["co"],d["nicon"]+d["ico"],d["nico"]+d["nico"],...)
  2. 因此,可以枚举最后一个字符串,记录它的分数,并更新答案

代码如下:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Arrays; 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]); long a=Integer.parseInt(s[1]); long b=Integer.parseInt(s[2]); long c=Integer.parseInt(s[3]); String str=br.readLine(); //abc有10^9,所以需要用long long[] dp=new long[n+1]; long ans=0; for(int i=4;i<=n;i++) { //此时的字符串为str的下标从0到i,不包括i //最后一个字符串不计分 dp[i]=dp[i-1]; //最后一个字符串为"nico" if(i>3) { if(str.substring(i-4, i).equals("nico")) { dp[i]=Math.max(dp[i], dp[i-4]+a); } } //最后一个字符串为"niconi" if(i>5) { if(str.substring(i-6, i).equals("niconi")) { dp[i]=Math.max(dp[i], dp[i-6]+b); } } //最后一个字符串为"niconiconi" if(i>9) { if(str.substring(i-10, i).equals("niconiconi")) { dp[i]=Math.max(dp[i], dp[i-10]+c); } } //更新答案 ans=Math.max(ans, dp[i]); } pw.println(ans); pw.flush(); } }