2018级《算法分析与设计》练习7(Java)

2018级《算法分析与设计》练习7(Java)

  • 问题 A: 数字交换
  • 问题 B: 习题6-6 杨辉三角
  • 问题 C: 放苹果
  • 问题 D: 小白鼠
  • 问题 E: 数字三角形之备忘录法
  • 问题 F: 数字三角形之动态规划法
  • 问题 G: 最长公共子序列问题(LCS)之备忘录法
  • 问题 H: 整数划分问题之备忘录法

问题 A: 数字交换

题目描述

输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后输出。

输入

测试数据有多组,输入n(1<=n<=20),接着输入n个数。

输出

对于每组输入,输出交换后的结果。

样例输入 Copy

2
1 3

样例输出 Copy

3 1

import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
   
public class Main {  
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
        int n=cin.nextInt();
        
        int M = 0,N = 0;
        int arr[]=new int[n];
        int Min = 0,Max = 0,MinIndex = 0,MaxIndex = 0,temp;
        for(int i=0;i<n;i++) {
            arr[i]=cin.nextInt();
        }
        for(int i=0;i<n;i++) {
             if(i == 0){
                 Min = arr[i];
                 Max = arr[i];
                 MinIndex = i;
                 MaxIndex = i;
             }
             if(Min > arr[i]){
                 Min = arr[i];
                 MinIndex = i;
             }
             if(Max < arr[i]){
                 Max = arr[i];
                 MaxIndex = i;
             }
 
 
        }
         
        temp = arr[MinIndex];
        arr[MinIndex] = arr[MaxIndex];
        arr[MaxIndex] = temp;
         
            for(int i = 0;i < n;i++){
                System.out.print(arr[i]);
                if(i != n-1){
                    System.out.print(" ");
                }
            }
            System.out.println();
         
   
        }
    }  
}

问题 B: 习题6-6 杨辉三角

题目描述

按要求输出如下格式的杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
最多输出10层。

输入

输入只包含一个正整数n,表示将要输出的杨辉三角的层数。

输出

对应于该输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开。

样例输入 Copy

5

样例输出 Copy

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
   
public class Main {  
     
     
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
        int n=cin.nextInt();
        int arr[][]=new int[n+1][n+1];
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=i;j++) {
                if(i==1||j==1||j==i) {
                    arr[i][j]=1;
                }else {
                    arr[i][j]=arr[i-1][j]+arr[i-1][j-1];
                }
            }
        }
         
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=i;j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
         
 
        }
        
        
    }  
}

问题 C: 放苹果

题目描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
(用K表示)5,1,1和1,5,1 是同一种分法。

输入

每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出

对输入的每组数据M和N,用一行输出相应的K。

样例输入 Copy

7 3

样例输出 Copy

8

import java.util.Scanner;
public class Main {
    public static int digui(int m,int n) {
        if(m==0||n==1) {return 1;}
        if(n>m) {return digui(m,m);}
        return digui(m,n-1)+digui(m-n,n);
    }
    public static void main(String[] args) {
         
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()) {
        int m=cin.nextInt();//panzi
        int n=cin.nextInt();//pingguo
        int k=0;
        k=digui(m,n);
        System.out.println(k);
         
         
        }
        }
         
    }
  

问题 D: 小白鼠

题目描述

N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子。
现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色。
帽子的颜色用“red”,“blue”等字符串来表示。
不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。

输入

多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目。
下面有N行,每行是一只白鼠的信息。第一个为不大于100的正整数,表示白鼠的重量;
第二个为字符串,表示白鼠的帽子颜色,字符串长度不超过10个字符。

注意:白鼠的重量各不相同。

输出

每个案例按照白鼠的重量从大到小的顺序输出白鼠的帽子颜色。

样例输入 Copy

3
30 red
50 blue
40 green

样例输出 Copy

blue
green
red

import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
   
public class Main {  
     
     
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
        int n=cin.nextInt();
        int w[]=new int [n];
        String c[]=new String[n];
        for(int i=0;i<n;i++) {
            w[i]=cin.nextInt();
            c[i]=cin.next();
        }
        for(int i=0;i<n;i++) {
            for(int j=i+1;j<n;j++) {
                if(w[i]<w[j]) {
                    int t=w[i];
                    w[i]=w[j];
                    w[j]=t;
                    String color=c[i];
                    c[i]=c[j];
                    c[j]=color;
                }
            }
        }
        for(int i=0;i<n;i++) {
            System.out.println(c[i]);
        }
         
        }
         
        
        
    }  
}

问题 E: 数字三角形之备忘录法

题目描述

如下图所示的数字三角形,从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。编写一个程序求出最佳路径上的数字之和。 【使用备忘录法实现】

     7 


   3   8 


 8   1   2 

2 7 4 4

4 5 2 6 5

输入

多组样例输入,每组第一行输入三角形的层数n,接下来n行输入三角形。

输出

输出最佳路径上的数字之和。

样例输入 Copy

2
1
1 2
3
1
1 2
1 2 3

样例输出 Copy

3
6

import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
   
public class Main {  
    static int dp[][]=new int [105][105];
    static int arr[][]=new int[105][105];
    static int n;
    public static int f(int i,int j) {
          if(dp[i][j]>=0) return dp[i][j]; //引入备忘录保存子问题的解
            if(i==n+1) return 0;
            return dp[i][j]=arr[i][j]+Math.max(f(i+1,j),f(i+1,j+1));
 
    }
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
          n=cin.nextInt();
          
               
          for(int i=1;i<=n;i++) {
              for(int j=1;j<=i;j++) {
                  arr[i][j]=cin.nextInt();
                  dp[i][j]=-1;
              } 
          }
          System.out.println(f(1,1));
       
        }
         
        
        
    }  
}

问题 F: 数字三角形之动态规划法

题目描述

如下图所示的数字三角形,从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。编写一个程序求出最佳路径上的数字之和。 【使用动态规划法实现】

     7 


   3   8 


 8   1   2 

2 7 4 4

4 5 2 6 5

输入

多组样例输入,每组第一行输入三角形的层数n,接下来n行输入三角形。

输出

输出最佳路径上的数字之和。

样例输入 Copy

2
1
1 2
3
1
1 2
1 2 3

样例输出 Copy

3
6

提示

路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。

import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
   
public class Main {  
     
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
         int n=cin.nextInt();
         int arr[][]=new int[n+1][n+1];
         int f[][]=new int[n+1][n+1];
         for(int i=1;i<=n;i++){
             for(int j=1;j<=i;j++){
                arr[i][j]=cin.nextInt();
            }
        }
         for(int i=1;i<=n;i++){
             f[n][i]=arr[n][i];
         }
         for(int i=n-1;i>=1;i--){
             for(int j=1;j<=i;j++){
                 f[i][j]=Math.max(f[i+1][j],f[i+1][j+1])+arr[i][j];
             }
         }
  System.out.println(f[1][1]);
         
        }
         
        
        
    }  
}

问题 G: 最长公共子序列问题(LCS)之备忘录法

题目描述

使用备忘录法求解两个序列的最长公共子序列的长度。

输入

每组输入包括两行,每行包括一个字符串。

输出

两个序列的最长公共子序列的长度。

样例输入 Copy

ACBCDABD
ABDCABA

样例输出 Copy

5

import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
   
public class Main {  
    static int dp[][]=new int [105][105];
    static int arr[][]=new int[105][105];
    public static int f(char arr1[],char arr2[],int n,int m) {
        if(n==0||m==0) {
            return 0;
        }else if(arr1[n-1]==arr2[m-1]) {
            dp[n][m]=f(arr1,arr2,n-1,m-1)+1;
        }else {
         
             dp[n][m]=Math.max(f(arr1,arr2,n-1,m),f(arr1,arr2,n,m-1));}
        return dp[n][m];
         
         
    }
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
          String a=cin.next();
          String b=cin.next();
          char[] arr1=a.toCharArray();
          char[] arr2=b.toCharArray();
          System.out.println(f(arr1,arr2,arr1.length,arr2.length));
               
          
       
        }
         
        
        
    }  
}


问题 H: 整数划分问题之备忘录法

题目描述

使用备忘录法编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。

输入

多组输入,每一组是一个正整数n。

输出

输出划分数。

样例输入 Copy

3
4

样例输出 Copy

3
5

import java.util.ArrayList;  
import java.util.List;  
import java.util.Scanner;  
   
public class Main {  
    static int dp[][]=new int[105][105];
    static int n;
    public static int f(int n,int m) {
         if((n<1)||(m<1)) return 0;
            if((n==1)||(m==1)) return 1;
            if(n<m) return f(n,n);
 
         if(n==m) {
                if (dp[n-1][n-2]==0) {
                    dp[n-1][n-2] = f(n,n-1);
                }
                return 1 + dp[n-1][n-2];
            }
            if (n>m) {
                if (dp[n-1][m-2]==0) {
                    dp[n-1][m-2] = f(n,m-1);
                }
                if (dp[n-m-1][m-1]==0) {
                    dp[n-m-1][m-1]=f(n-m,m);
                }
                return dp[n-1][m-2] + dp[n-m-1][m-1];
            }else {return 0;}
 
         
         
             
    }
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
             n=cin.nextInt();
            System.out.println(f(n,n));
             
        }
        
             
             
             
        }
       
}

你可能感兴趣的:(算法题)