字节0820最后一题求教(报错内存超出)

第四题题目:给定 01数组串,求字数组 连续取值的段数的求和

例如 1101的值就是 17 = (长度为1的子串,连续取值个数)1+1+1+1 + (长度为2的子串,连续取值段数)1 + 2 + 2 + (长度为3的子串,连续取值段数)2+3 + (长度为4的子串,连续取值段数)+3

我自己的代码用的是动态规划思想,dp[i][j] = Math.max(dp[i+1][j] + (if nums[i] == nums[i+1] then 0 else 1) , dp[i][j-1] +(if nums[j] == nums[j-1] then 0 else 1)

考试最后发现了需要把数量改为long求和,但是在 long[][] dp = new long[n][n];这一句就发生了溢出,求教要怎么改呢?还是说需要对结果取余数,我看题目没有说明需要取余数。

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

// 注意 hasNext 和 hasNextLine 的区别

while (in.hasNextInt()) { // 注意 while 处理多个 case

int n = in.nextInt();

// char[] nums= s.toCharArray();

String s = in.next();

char[] nums= s.toCharArray();

int[] continuous_1 = new int[n];

long[][] dp = new long[n][n];

int cnt_1 = 0;

long cnt_sum = 0;

for(int i = 0;i<n;i++){

// i开头长度为1的最小字符串

dp[i][i] = 1;

cnt_sum+=1;

}

for(int len = 1;len<n;len++){

for(int i = 0;i<n-len;i++){

int j = i+len;

// dp[i][j] = dp[i][j-1];

if(i<n-1){

if(nums[i] == nums[i+1]){

dp[i][j] = Math.max(dp[i][j], dp[i+1][j]);

}else{

dp[i][j] = Math.max(dp[i][j], dp[i+1][j]+1);

}

}

if(nums[j] == nums[j-1]){

dp[i][j] = Math.max(dp[i][j], dp[i][j-1]);

}else{

dp[i][j] = Math.max(dp[i][j], dp[i][j-1]+1);

}

cnt_sum += dp[i][j];

}

}

System.out.println(cnt_sum);

}

}

}

全部评论
我倒没往dp想去推贡献和的公式一次就过了,原来还可以dp
点赞 回复 分享
发布于 2023-08-20 21:15 广东
不用这样 算一个10或者01左右的串长度就行 1110 的10左边长度2 右边长度0 出现在的子串数就是3*1
点赞 回复 分享
发布于 2023-08-20 21:35 北京

相关推荐

点赞 评论 收藏
分享
02-19 12:50
黑龙江大学 Java
饼子吃到撑:你给他20,让他给你上班你看看他愿不愿意
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务