第九周习题

ゝ一世哀愁。 2022-10-21 03:59 224阅读 0赞

记录

  • A、最大字段和升级版
    • 代码
  • B、斜线最大最小值
    • 代码
  • C、矩阵连乘问题-备忘录法求最优值
    • 代码
  • D、矩阵连乘问题-动态规划求最优值
    • 代码
  • E、矩阵连乘问题-构造最优解
    • 代码
  • F、石子合并问题
    • 代码

A、最大字段和升级版

题目描述

  • 使用动态规划算法求整数数组(可能包含负整数)的最大子段和,以及和最大子段的起始位置和结束位置:
    例如:输入数组(6,-1,5,4,-7),输出14, 1,4,其中14表示最大子段和,1表示和最大的子段从第1个数字开始,4表示和最大的子段到第4个数字结束,即(6, -1 , 5, 4)。

输入

  • 每组输入两行,第1行为数组中包含的整数个数n,第2行为n个整数(可能包含负整数),两两之间用空格隔开。

输出

  • 输出最大子段和,以及和最大子段的起始位置和结束位置,两两之间用空格隔开。

样例输入 Copy

  1. 5
  2. 6 -1 5 4 -7

样例输出 Copy

  1. 14 1 4

【这个题目,直接贯穿了我的整个五一假期,还多加了几天的时间,其实大部分代码我都写好了,只有一个地方有问题,就是输入1,它只会输出1 0 0,不是输出1 1 1 ,然而就是这个问题困扰了我好久好久,然后就是,因为五一也出去完了,更加没思路了,好不容易问了室友才恍然大悟,就是我设置的起始位置和终止位置的初始化一直都是设置的0,改成1就行了,所以我那么久CSDN也没找到答案,哭了~我室友是直接在循环的过程记录起始位置的,所以直接调用输出就行,但是我懒得改了,放一个链接吧,对后面的题目有很大帮助哈:和我一样的题目~戳她戳她!】

代码

  1. import java.util.Scanner;
  2. public class Main {
  3. public static int []a = new int[105];
  4. public static int []b = new int[105];
  5. public static int n,maxSum,index,maxIndex,max_S;
  6. public static void solve(){
  7. b[0] = a[0];
  8. maxSum = b[0];
  9. index = 1;
  10. maxIndex = 1;
  11. for(int j=1;j<n;j++){
  12. if(b[j-1]>0)
  13. b[j] = b[j-1]+a[j];
  14. else{
  15. b[j] = a[j];
  16. }
  17. if(b[j]>maxSum){
  18. maxSum = b[j];
  19. maxIndex = j+1;
  20. }
  21. max_S = maxSum;
  22. for(int i = maxIndex-1;i>=0;i--){
  23. max_S-=a[i];
  24. if(max_S==0)
  25. index = i+1;
  26. }
  27. }
  28. }
  29. public static void main(String[] args) {
  30. // TODO Auto-generated method stub
  31. Scanner sc = new Scanner(System.in);
  32. while(sc.hasNext()){
  33. n = sc.nextInt();
  34. for(int i=0;i<n;i++)
  35. a[i] = sc.nextInt();
  36. solve();
  37. System.out.println(maxSum+" "+index+" "+maxIndex);
  38. }
  39. }
  40. }

B、斜线最大最小值

题目描述

  • 求如图所示一个上三角矩阵中每一条斜线中的最大元素(L)和最小元素(S)。
    在这里插入图片描述
    输入
  • 每组输入包括两部分,一部分为数字n,表示三角矩阵的行数。
  • 第二部分即为三角矩阵。

输出

  • 每一个对角线输出一行,每行包括Lx=Max,
    Sx=Min,其中x为斜线序号(序号从1开始),Max为该斜线上的最大值,Min为该斜线上的最小值。

样例输入 Copy

  1. 6
  2. 1 3 5 7 11 20
  3. 0 6 8 2 3 13
  4. 0 0 7 4 8 9
  5. 0 0 0 18 3 10
  6. 0 0 0 0 12 6
  7. 0 0 0 0 0 15

样例输出 Copy

  1. L1=18, S1=1
  2. L2=8, S2=3
  3. L3=10, S3=2
  4. L4=9, S4=3
  5. L5=13, S5=11
  6. L6=20, S6=20
  7. 【有问题的话就戳上面的那个链接吧~我就是根据那个来的】

代码

  1. import java.util.Scanner;
  2. public class Main {
  3. public static int a[][] = new int[105][105];
  4. public static int max,min;
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7. Scanner sc = new Scanner(System.in);
  8. while(sc.hasNext()){
  9. int n = sc.nextInt();
  10. max = 0;min = 0;
  11. for(int i=1;i<=n;i++)
  12. for(int j=1;j<=n;j++)
  13. a[i][j] = sc.nextInt();
  14. for(int r=1;r<=n;r++){
  15. max = a[1][r];
  16. min = a[1][r];
  17. for(int i=1;i<=n-r+1;i++){
  18. int j=r+i-1;
  19. if(max<a[i][j])//最大值
  20. max = a[i][j];
  21. else if(min>a[i][j])//最小值
  22. min = a[i][j];
  23. }
  24. System.out.println("L"+r+"="+max+", "+"S"+r+"="+min);
  25. }
  26. }
  27. }
  28. }

C、矩阵连乘问题-备忘录法求最优值

题目描述

  • 使用备忘录法求解矩阵连乘问题,输出最少乘法次数。

输入

  • 每组数据包括两行,第一行为数组长度n,第二行为存储矩阵维数的一维数组。

输出

  • 矩阵连乘最优计算次数。

样例输入 Copy

  1. 7
  2. 30 35 15 5 10 20 25

样例输出 Copy

  1. 15125

代码

  1. import java.util.Scanner;
  2. public class Main {
  3. public static int m[][] = new int[105][105];
  4. public static int s[][] = new int[105][105];
  5. public static int p[] = new int[105];
  6. public static int n;
  7. public static int lookup(int i,int j){
  8. for(int k=0;k<n;k++)
  9. for(int t=0;t<n;t++)
  10. m[k][t] = 0;
  11. if(m[i][j]>0)
  12. return m[i][j];
  13. if(i==j)
  14. return 0;
  15. int u = lookup(i+1,j)+p[i-1]*p[i]*p[j];
  16. s[i][j] = i;
  17. for(int k = i+1;k<j;k++){
  18. int t = lookup(i,k)+lookup(k+1,j)+p[i-1]*p[k]*p[j];
  19. if(t<u){
  20. u = t;
  21. s[i][j] = k;
  22. }
  23. }
  24. m[i][j] = u;
  25. return u;
  26. }
  27. public static void main(String[] args) {
  28. // TODO Auto-generated method stub
  29. Scanner sc = new Scanner(System.in);
  30. while(sc.hasNext()){
  31. n = sc.nextInt();
  32. for(int i=0;i<n;i++)
  33. p[i] = sc.nextInt();
  34. System.out.println(lookup(1,n-1));
  35. }
  36. }
  37. }

D、矩阵连乘问题-动态规划求最优值

题目描述

  • 使用动态规划算法求解矩阵连乘问题,输出最少乘法次数。

输入

  • 每组数据包括两行,第一行为数组长度n,第二行为存储矩阵维数的一维数组。

输出

  • 矩阵连乘最优计算次数。

样例输入 Copy

  1. 7
  2. 30 35 15 5 10 20 25

样例输出 Copy

  1. 15125

代码

  1. import java.util.Scanner;
  2. public class Main {
  3. public static int m[][] = new int[105][105];
  4. public static int s[][] = new int[105][105];
  5. public static int p[] = new int[105];
  6. public static int n;
  7. public static void matrixChain(int []p,int [][]m,int [][]s){
  8. for(int i=1;i<=n;i++)
  9. m[i][i] = 0;
  10. for(int r=2;r<=n;r++)
  11. for(int i=1;i<=n-r+1;i++){
  12. int j = i+r-1;
  13. m[i][j] = m[i+1][j]+p[i-1]*p[i]*p[j];
  14. s[i][j] = i;
  15. for(int k = i+1;k<j;k++){
  16. int t = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
  17. if(t<m[i][j]){
  18. m[i][j] = t;
  19. s[i][j] = k;
  20. }
  21. }
  22. }
  23. }
  24. public static void main(String[] args) {
  25. // TODO Auto-generated method stub
  26. Scanner sc = new Scanner(System.in);
  27. while(sc.hasNext()){
  28. n = sc.nextInt();
  29. for(int i=0;i<n;i++)
  30. p[i] = sc.nextInt();
  31. matrixChain(p,m,s);
  32. System.out.println(m[1][n-1]);
  33. }
  34. }
  35. }

E、矩阵连乘问题-构造最优解

题目描述

  • 使用动态规划算法求解矩阵连乘问题。

输入

  • 每组数据包括两行,第一行为数组长度n,第二行为存储矩阵维数的一维数组。

输出

  • 矩阵连乘最优计算次序。

样例输入 Copy

  1. 7
  2. 30 35 15 5 10 20 25

样例输出 Copy

  1. A[2:2] * A[3:3]
  2. A[1:1] * A[2:3]
  3. A[4:4] * A[5:5]
  4. A[4:5] * A[6:6]
  5. A[1:3] * A[4:6]

代码

  1. import java.util.Scanner;
  2. public class Main {
  3. public static int m[][] = new int[105][105];
  4. public static int s[][] = new int[105][105];
  5. public static int p[] = new int[105];
  6. public static int n;
  7. public static void matrixChain(int []p,int [][]m,int [][]s){
  8. for(int i=1;i<=n;i++)
  9. m[i][i] = 0;
  10. for(int r=2;r<=n;r++)
  11. for(int i=1;i<=n-r+1;i++){
  12. int j = i+r-1;
  13. m[i][j] = m[i+1][j]+p[i-1]*p[i]*p[j];
  14. s[i][j] = i;
  15. for(int k = i+1;k<j;k++){
  16. int t = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
  17. if(t<m[i][j]){
  18. m[i][j] = t;
  19. s[i][j] = k;
  20. }
  21. }
  22. }
  23. }
  24. public static void traceback(int [][]s,int i,int j){
  25. if(i==j)
  26. return;
  27. traceback(s,i,s[i][j]);
  28. int t = s[i][j]+1;
  29. traceback(s,t,j);
  30. System.out.println("A["+i+":"+s[i][j]+"] * "+"A["+t+":"+j+"]");
  31. }
  32. public static void main(String[] args) {
  33. // TODO Auto-generated method stub
  34. Scanner sc = new Scanner(System.in);
  35. while(sc.hasNext()){
  36. n = sc.nextInt();
  37. for(int i=0;i<n;i++)
  38. p[i] = sc.nextInt();
  39. matrixChain(p,m,s);
  40. traceback(s,1,n-1);
  41. }
  42. }
  43. }

F、石子合并问题

题目描述

  • 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。例如:输入{1,2,3,4,5},输出33。【3+6+9+15=33】

输入

  • 本题应该处理到文件尾,每组输入包括两行,第一行为石子堆的个数n,第二行则为每堆石子的个数。

输出

  • 输出最小花费。

样例输入 Copy

  1. 5
  2. 1 2 3 4 5

样例输出 Copy

  1. 33

代码

  1. import java.util.Scanner;
  2. public class Main {
  3. public static int m[][] = new int[105][105];
  4. public static int s[][] = new int[105][105];
  5. public static int p[] = new int[105];
  6. public static int n;
  7. public static void matrixChain(int []p,int [][]m,int [][]s){
  8. for(int i=1;i<=n;i++)
  9. m[i][i] = 0;
  10. for(int r=2;r<=n;r++)
  11. for(int i=1;i<=n-r+1;i++){
  12. int j = i+r-1;
  13. m[i][j] = m[i+1][j]+s[i][j];
  14. for(int k = i+1;k<j;k++){
  15. int t = m[i][k]+m[k+1][j]+s[i][j];
  16. if(t<m[i][j]){
  17. m[i][j] = t;
  18. }
  19. }
  20. }
  21. }
  22. public static void main(String[] args) {
  23. // TODO Auto-generated method stub
  24. Scanner sc = new Scanner(System.in);
  25. while(sc.hasNext()){
  26. n = sc.nextInt();
  27. for(int i=1;i<=n;i++)
  28. p[i] = sc.nextInt();
  29. for(int i=1;i<=n;i++)
  30. s[i][i] = p[i];
  31. for(int i=1;i<=n;i++)
  32. for(int j=i+1;j<=n;j++)
  33. s[i][j] = s[i][j-1]+p[j];
  34. matrixChain(p,m,s);
  35. System.out.println(m[1][n]);
  36. }
  37. }
  38. }

【鉴于小编五一的时候学骑自行车摔伤了,所以就不和你们唠嗑了,小编虽然五一摔伤了,但是还是和室友出去玩了,去拍了很多照片,吃了臭豆腐,吃了炸鸡,吃了凉皮,吃了好多好多东西,O(∩_∩)O哈哈~,开心!】

句子君:
“但是啊,这世界上不是所有的事情都能如你所愿,有样东西必定会成为你成功的绊脚石,知道是什么吗?就是人的感情!无聊的嫉妒、傲慢、偏见、迷恋都是绊脚石,压制住这些感情,权衡眼前的利益取舍,这就是胜负的关键,只有成功才能开创人生道路,不管别人怎样把你当傻瓜,怎样被社会无视,只要拿出成果就会让人重新认识你,只要通过这一场考试,就能使生活环境发生巨变,被一时感情冲昏而损失利益的只能称之为傻瓜。”

发表评论

表情:
评论列表 (有 0 条评论,224人围观)

还没有评论,来说两句吧...

相关阅读

    相关 题目

    Java继承和多态之abstract类 > 任务描述 :完成抽象类的定义与使用 相关知识 > Java 语言提供了两种类,分别为具体类和抽象类。前面学习接触的类都是具