[英]Error with matrices and array index out of bounds
因此,我需要實現此代碼,該代碼將從java中矩陣的乘法返回最佳的括號解決方案。 我制作了一個用於打印“(”“)”的函數,主要是為分辨率(動態編程)構造了矩陣M和S。 在打印第一個“(”)之后,我一直收到此錯誤:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at ProgramacaoDinamica.parenterizacao(ProgramacaoDinamica.java:13)
at ProgramacaoDinamica.main(ProgramacaoDinamica.java:46)
碼:
public class ProgramacaoDinamica {
private static int[][] s;
public static void parenterizacao(int[][] s, int i, int j) {
if (i == j) {
System.out.println("M" + i);
} else {
System.out.println("(");
parenterizacao(s, i, s[i][j]);
parenterizacao(s, s[i][j] + 1, j);
System.out.println(")");
}
}
public static void main(String[] args) {
int[] p = {15, 5, 10, 20, 25}; //VETOR P DO ENUNCIADO (alteracoes aqui!!!)
int n = p.length - 1;
int[][] m = new int[n][n];
int[][] s = new int[n - 1][n - 1];
for (int i = 0; i < n; i++) {
m[i][i] = 0;
}
for (int l = 1; l < n; l++) {
for (int i = 1; i <= l - n + 1; i++) {
int j = i + l - 1;
m[i][j] = 9999;
for (int k = i; k <= j - 1; k++) {
int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j]) {
m[i][j] = q;
s[i][j] = k;
}
}
}
}
parenterizacao(s, 1, n);
}
}
簡短的答案是,您要創建一個3x3數組,然后嘗試訪問第二行中的第五個元素,該元素顯然不存在。
如代碼所示,您正在將偽代碼中s[0..n-1][0..n-2]
s[1..n-1,2..n]
映射s[1..n-1,2..n]
中的s[0..n-1][0..n-2]
,例如偽代碼說s[1,2]
您的Java使用s[0][0]
但您並未在對parenterizacao(s,1,n)
調用中減去1和2
您可能在某些地方混合使用索引將索引從零開始,而在其他地方則沒有映射,因此您應該使索引保持一致-要么像使用偽代碼一樣直接使用索引,然后使用未使用的元素使數組變大(例如而不是s[0..2][0..2]
具有s[0..3][0..4]
),或者確保每次訪問數組時都映射索引。
下面,我修改了您的代碼,並保留了偽代碼中i
, j
, k
, l
和n
的原始值,但在每次數組訪問時都適當地減去了1或2:
public static void parenterizacao(int[][] s, int i, int j) {
if (i == j) {
System.out.println("M" + i);
} else {
System.out.println("(");
parenterizacao(s, i, s[i-1][j-2]);
parenterizacao(s, s[i-1][j-2] + 1, j);
System.out.println(")");
}
}
和
for (int i = 1; i <= n; i++) {
m[i-1][i-1] = 0;
}
for (int l = 2; l <= n; l++) {
for (int i = 1; i <= n - l + 1; i++) {
int j = i + l - 1;
m[i-1][j-1] = 9999;
for (int k = i; k <= j - 1; k++) {
int q = m[i-1][k-1] + m[k][j-1] + p[i - 1] * p[k] * p[j];
if (q < m[i-1][j-1]) {
m[i-1][j-1] = q;
s[i-1][j-2] = k;
}
}
}
}
parenterizacao(s, 1, n);
(還需要在內循環中切換n
和l
以匹配偽代碼)
問題是您的嵌套循環。
for (int l = 1; l < n; l++)
for (int i = 1; i < l - n; i++)
在這里, n = 3
並已綁定到l
上,已經是3。然后,您將i = 3賦值,並嘗試通過遞增i
達到2。
還有一件事,你應該放return;
遞歸函數中的某處。 否則,您將陷入無限循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.