一、数字三角形
(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
径,使该路径所经过的数字的总和最大。
●每一步可沿左斜线向下或右斜线向下走;
●1<三角形行数≤100;
●三角形中的数字为整数0,1,…99;
(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
径,使该路径所经过的数字的总和最大。
●每一步可沿左斜线向下或右斜线向下走;
●1<三角形行数≤100;
●三角形中的数字为整数0,1,…99;
1 import java.math.BigInteger; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 5 6 public class Main { 7 static int[][] a; 8 static int n; 9 public static void main(String[] args) { 10 Scanner input = new Scanner(System.in); 11 n = input.nextInt(); 12 a = new int[n][n]; 13 for(int i=0;i<n;i++){ 14 for(int j=0;j<=i;j++){ 15 a[i][j] = input.nextInt(); 16 } 17 } 18 System.out.println(f(0,0)); 19 20 21 } 22 //某数的当前最大和等于当前数加上下一行与之相邻的两数的当前最大和。 23 public static int f(int i,int j){ 24 if(i==n-2) return a[i][j]+Math.max(a[i+1][j], a[i+1][j+1]); 25 return a[i][j]+Math.max(f(i+1,j), f(i+1,j+1)); 26 } 27 }
二、未名湖边的烦恼
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
1 import java.math.BigInteger; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 5 6 public class Main { 7 static int n; 8 static int m; 9 static int sum; 10 public static void main(String[] args) { 11 Scanner input = new Scanner(System.in); 12 m = input.nextInt(); 13 n = input.nextInt(); 14 if(m>=n) f(m-1,n,1); 15 System.out.println(sum); 16 } 17 public static void f(int m,int n,int k){ 18 if(k<0) return; 19 if(m==0||n==0) sum++; 20 else{ 21 f(m-1,n,k+1); 22 f(m,n-1,k-1); 23 } 24 25 } 26 }
三、s01串
s01串初始为"0"
按以下方式变换
0变1,1变01
1 import java.math.BigInteger; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 5 6 public class Main { 7 public static void main(String[] args) { 8 Scanner input = new Scanner(System.in); 9 int n = input.nextInt(); 10 StringBuffer a = new StringBuffer("0"); 11 f(n,a); 12 } 13 public static void f(int n,StringBuffer a){ 14 if(n==0){ 15 System.out.println(a.toString()); 16 return; 17 } 18 StringBuffer temp = new StringBuffer(); 19 for(int i=0;i<a.length();i++){ 20 if(a.charAt(i)=='0'){ 21 temp.append("1"); 22 }else{ 23 temp.append("01"); 24 } 25 } 26 f(n-1,temp); 27 } 28 }
四、递归求二进制表示位数
1 import java.math.BigInteger; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 5 6 public class Main { 7 public static void main(String[] args) { 8 Scanner input = new Scanner(System.in); 9 int a = input.nextInt(); 10 System.out.println(f(a)); 11 } 12 public static int f(int a){ 13 if(a==0) return 0; 14 return 1+f(a/2); 15 } 16 }
五、猴子分苹果
1 import java.math.BigInteger; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 5 6 public class Main { 7 static int n; 8 static int m; 9 public static void main(String[] args) { 10 Scanner input = new Scanner(System.in); 11 n = input.nextInt(); 12 m = input.nextInt(); 13 int i=1; 14 while(true){ 15 i++; 16 if(f(i,0)==1){ 17 System.out.println(i); 18 break; 19 } 20 21 } 22 23 } 24 public static int f(int sum,int i){ 25 if(sum%n!=m) return 0; 26 if(i==n&&sum%n==m){ 27 return 1; 28 } 29 return f(sum-(sum-m)/n-m,i+1); 30 } 31 }
六、瓷砖铺放
有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限。要将这个长度为N的地板铺满,一共有多少种不同的铺法?
例如,长度为4的地面一共有如下5种铺法:
4=1+1+1+1
4=2+1+1
4=1+2+1
4=1+1+2
4=2+2
编程用递归的方法求解上述问题
import java.math.BigInteger; import java.util.Arrays; import java.util.Scanner; public class Main { static int n; static int m; public static void main(String[] args) { Scanner input = new Scanner(System.in); n = input.nextInt(); f(n); System.out.println(m); } public static void f(int n){ if(n>=2){ f(n-1); f(n-2); }else if(n==1){ f(n-1); }else{ m++; } } }
七、求先序排列
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
1 import java.math.BigInteger; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 5 6 public class Main { 7 static String a; 8 static String b; 9 public static void main(String[] args) { 10 Scanner input = new Scanner(System.in); 11 a = input.next(); 12 b = input.next(); 13 f(0,a.length()-1,b.length()-1); 14 15 } 16 public static void f(int a1,int b1,int b2){ 17 if(a1>b1) return; 18 System.out.print(b.charAt(b2)); 19 f(a1,a.indexOf(b.charAt(b2))-1,b2-(b1-a.indexOf(b.charAt(b2)))-1); 20 f(a.indexOf(b.charAt(b2))+1,b1,b2-1); 21 22 23 24 } 25 }
八、种树
A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门 得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤 肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。
最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大。如果无法将m棵树苗全部种上,给出无解信息。
第二行n个整数Ai。
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 import java.math.BigInteger; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 5 6 public class Main { 7 static int n; 8 static int[] a; 9 static boolean[] b; 10 static int max; 11 static boolean flag; 12 public static void main(String[] args) { 13 Scanner input = new Scanner(System.in); 14 n = input.nextInt(); 15 int m = input.nextInt(); 16 a = new int[n]; 17 for(int i=0;i<n;i++){ 18 a[i] = input.nextInt(); 19 } 20 b = new boolean[n]; 21 f(m,0,0); 22 if(flag) System.out.println(max); 23 else System.out.println("Error!"); 24 } 25 public static void f(int i,int j,int sum){ 26 if(i==0&&j<=n){ 27 if(max<sum) max = sum; 28 flag = true; 29 return; 30 } 31 for(int h=j;h<n;h++){ 32 if(b[h]==false){ 33 if(h<n-1) b[h+1] = true; 34 if(h==0){b[n-1] = true;b[h] = true;} 35 f(i-1,h+1,sum+a[h]); 36 if(h<n-1) b[h+1] = false; 37 if(b[0]==true) b[n-1] = true; 38 if(h==0){b[n-1] = false;b[h] = false;} 39 } 40 } 41 42 43 } 44 }