PS:
好久没写过算法题了,总感觉自己写的思路没问题,但是结果就是不对,希望哪位大佬有时间能给找找问题
超级胶水
小明有n颗石子,按顺序摆成一排,他准备用胶水将这些石子黏在一起。
梅克什字有自己的重量,如果将两颗石子黏在一起,重量就是两个石子重量之和
为了粘贴牢固,该题认为两个石子粘连需要的胶水为两个石子的重量乘积。
每次只能合并相邻的两颗石子,并将合成的石子放在原来的位置,用最少的交水黏在一起,
请帮助小明计算最少需要多少胶水
输入:
n:石子的数量
n个整数w1,w2……wn,表示每颗石子的重量
输出:
最少的胶水数量
package 第十一届蓝桥杯;
import java.util.Scanner;
public class 超级胶水 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[1010];
int[][] temp = new int[1010][1010];
int[][] dp = new int[1010][1010];
int[][] jiaoshui = new int[1010][1010];
// int[][] jiao = new int[1010][1010];
// int[][] zong = new int[1010][1010];
for (int i=1; i<=n; i++) {
a[i] = in.nextInt();
temp[i][i] = a[i];
// jiao[i][i]=a[i];
dp[i][i]=a[i];
}
for (int i=1; i<n; i++) {
for(int j=i+1; j<=n; j++) {
temp[i][j] = temp[i][j-1] + a[j];
// jiao[i][j]=jiao[i][j-1]*a[i];
}
}
for (int r=2; r<=n; r++) {
for (int i=1; i<=n-r+1; i++) {
int j=i+r-1;
jiaoshui[i][j] = Integer.MAX_VALUE;
dp[i][j] = Integer.MAX_VALUE;
int temp1 = 0;
for (int k=i; k<j; k++) {
if(jiaoshui[i][j] > dp[i][k] * dp[k+1][j])
temp1=k;
dp[i][j] = dp[i][k] + dp[k+1][j];
jiaoshui[i][j] = dp[i][k] * dp[k+1][j];
}
jiaoshui[i][j]+=jiaoshui[i][temp1];
jiaoshui[i][j]+=jiaoshui[temp1+1][j];
// dp[i][j] += temp[i][j];
// jiaoshui[i][j]*=jiao[i][j];
}
}
// System.out.println(dp[1][n]);
System.out.println(jiaoshui[1][n]);
// System.out.println(zong[1][n]);
}
}

被折叠的 条评论
为什么被折叠?



