题目的链接在这里:https://www.nowcoder.com/practice/70a03345bae6499ea4338ebc3a0b60e9
- 题目大意
- 一、示意图
- 二、解题思路
- 字符串加动态规划
题目大意 给定一个字符串 S ,定义三种有价值的字符串: A = "nico" ,B = "niconi" , C = "niconiconi" 其中,字符串 A 的价值为 a, 字符串 B 的价值为 b,字符串 C 的价值为 c 她拿到了一个长度为 n 的字符串,你需要在其中找到一些有价值的子串 (指字符串中连续的一段),并统计价值之和的最大值。 注:已被计算价值过的字符不能重复计算价值!如 "niconico" 要么当作 "nico" + "nico" 计 2a 分,要么当作 "niconi" + "co" 计 b 分(其中 "co" 不计分)。
一、示意图 二、解题思路
字符串加动态规划字符串加动态规划
代码如下:
import java.util.*;
public class Main{
public static void main(String[] args){
//字符串S 不同的字符串有不同的价值
Scanner sc=new Scanner(System.in);
String[] nums=sc.nextLine().split(" ");
int n=Integer.parseInt(nums[0]);
int a=Integer.parseInt(nums[1]);
int b=Integer.parseInt(nums[2]);
int c=Integer.parseInt(nums[3]);
//然后是长度为n的字符串
String str=sc.nextLine();
//先进行边界判断
if(n<=3){
System.out.println(0);
}
if(n==4){
//那就按照4的进行比较
if(str.equals("nico")){
System.out.println(a);
}else{
System.out.println(0);
}
}
int []dp=new int[n];
//先进行初始化
dp[0]=0;
dp[1]=0;
dp[2]=0;
//判断第一个是不是nico subString是左闭右开的
if(str.substring(0,4).equals("nico")){
dp[3]=a;
}else{
dp[3]=0;
}
//然后开始判断
for(int i=4;i=5&&str.substring(i-5,i+1).equals("niconi")){
//再进行更新 这里i-6就要成为负数了
if(i==5){
dp[i]=Math.max(dp[i],b);
}else {
dp[i] = Math.max(dp[i], dp[i - 6] + b);
}
}
//再判断和 niconiconi的
if(i>=10&&str.substring(i-9,i+1).equals("niconiconi")){
dp[i]=Math.max(dp[i],dp[i-10]+c);
}
}
System.out.println(dp[n-1]);
}
}


![java 牛客网之[动态规划 简单]NC3 nico和niconiconi java 牛客网之[动态规划 简单]NC3 nico和niconiconi](http://www.mshxw.com/aiimages/31/357889.png)
