字节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);
}
}
}