Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 算法中超出时间限制的错误_Java_Algorithm - Fatal编程技术网

Java 算法中超出时间限制的错误

Java 算法中超出时间限制的错误,java,algorithm,Java,Algorithm,我想转换一个3的可除数 一个数字可以转换成其他数字,数字的位数相同,并且没有前导零。 将一个数字转换为另一个数字的成本是相应数字的绝对差之和。例如,将235转换为331的成本为5(因为相应数字的绝对差值为| 3−2|+|3−3|+|1−5 |,也就是| 1 |+0+|−4|=5. 可在成本范围内创建的数字≤66个中的3个是36,45,54,57,63,66,69,75,78,87,96,所以答案是11 我的方法:我将输入作为字符串,然后 使用递归调用实现所有组合 public static v

我想转换一个3的可除数

一个数字可以转换成其他数字,数字的位数相同,并且没有前导零。

将一个数字转换为另一个数字的成本是相应数字的绝对差之和。例如,将235转换为331的成本为5(因为相应数字的绝对差值为| 3−2|+|3−3|+|1−5 |,也就是| 1 |+0+|−4|=5.

可在成本范围内创建的数字≤66个中的3个是36,45,54,57,63,66,69,75,78,87,96,所以答案是11

我的方法:
我将输入作为字符串,然后 使用递归调用实现所有组合

public static void cal(int len , int sum , int c , String SS){

    if(c>cost) return ;
    if(len==SS.length()){
        if(sum%3==0) ans++;
        return;
    }

    for(int i=0;i<=9;i++){
        int xx =Math.abs(i-Character.getNumericValue(SS.charAt(len)));
        cal(current+1, len+1, sum+i, c+xx, SS);
    }
}
publicstaticvoidcal(int len、int sum、int c、stringss){
如果(c>成本)返回;
如果(len==SS.length()){
如果(总和%3==0)ans++;
返回;
}

对于(inti=0;i这就是我解决问题的方法:你需要一个dp[p][C][S]数组,其中dp[i][j][k]指定你在数字表示中的位置i,你有j的钱,到目前为止的总和是k。 基本思想是,如果你改变(或不改变)一个数字,这个问题将简化为一个子问题(左数字、左货币、总金额)。每个数字最多有10个选项,因此要填充每个状态,你将需要一个10的循环。因此,时间复杂度O(P*C*S*10)。因为N在最大P=19(数字)时仅为最大值10^18,C=200(如你所述)最大值的S是9*18(数字之和)。因此,对于给定的时间约束以及O(P*C*S)的内存,该算法是合适的
因此,除了递归逻辑之外,还需要使用记忆(存储已访问状态的答案)与递归一起。

对于这样的问题,使用递归生成所有可能性会导致所需时间随着输入大小的增长呈指数增长。如果您想要一种算法能够快速处理较大的输入大小,您最好考虑一种不生成所有可能性的计算方法

你可能想要一个事实,一个数字的数字之和,可以被3整除,也可以被3整除


因此,也许可以看看原始数字的数字之和得到的模3是什么。例如,如果它是1,那么数字值的总变化将需要是2模3。然后你可以从那里开始

将一个数字转换为3的可除数意味着什么?因此,你想计算所有可由3除的数字,这些数字可以由上述转换,在规定的成本范围内?首先你应该利用的是,一个可被3整除的数字具有这样的性质,即它的数字和一个可被3整除的数字之和。这与你的成本函数密切相关。你还应该给出这个问题的链接,以便有一个清晰的问题陈述
public static void cal(int len , int sum , int c , String SS){

    if(c>cost) return ;
    if(len==SS.length()){
        if(sum%3==0) ans++;
        return;
    }

    for(int i=0;i<=9;i++){
        int xx =Math.abs(i-Character.getNumericValue(SS.charAt(len)));
        cal(current+1, len+1, sum+i, c+xx, SS);
    }
}
 for(int i=1;i<=9;i++){
     int xx =Math.abs(i-Character.getNumericValue(SS.charAt(0)));
     cal(i, 1, i, xx , SS);
 }