链家编程题
来源:互联网 发布:三维平面布置图软件 编辑:程序博客网 时间:2024/05/16 17:01
题目是这样的,一个序列上有n个整数,现在你要取m个,且这m个数的任意两个不能相隔的太近,否则这样会太丑,现在问你最大能得到多大的和
输入:
第一行三个数n,m,k,分别表示n个数,取m个,且m个中的任意两个位置差要大于等于K
接下来一行,有n个整数,表示序列上的每个数
输出:
最大和
Sample Input
4 2 2
3 4 -5 1
Sample Output
5
参考:http://blog.csdn.net/minfrommyfls/article/details/8070280
import java.util.Scanner;public class test2 { public static void main(String[] args) { /* 4 2 2 3 4 -5 1*/ Scanner cin = new Scanner(System.in); int [] A =new int[10005]; int [][] F =new int[10005 + 10005][105]; int n = cin.nextInt(); int m = cin.nextInt();//取m个 int k = cin.nextInt();//位置差 int [] arr = new int[n]; for(int i=0;i<n;i++){ A[i]=cin.nextInt(); if (A[i] > F[i - 1 + 10005][1]) { F[i + 10005][1] = A[i]; } else F[i + 10005][1] = F[i + 10004][1]; } for(int i = 1; i <= n; i++) for(int j = 2; j <= m; j++) { F[i + 10005][j] = F[i + 10004][j]; if (i > k) { F[i + 10005][j] = Math.max(F[i + 10005][j], F[i - k + 10005][j - 1] + A[i]); } } System.out.println(F[n + 10005][m]); }}
2.最长公共子序列
package lianjia2;import java.util.Scanner;public class test3 { public static int count = 0; //最长公共子序列 public static void main(String[] args) { /*ABCBDAB BDCABA */ String[]x={"","A","B","C","B","D","A","B"}; String[]y={"","B","D","C","A","B","A"}; int[][]b=getLength(x,y); Display(b,x,x.length-1,y.length-1); System.out.println(count); } public static int[][] getLength(String[]x,String[]y) { int[][]b=new int[x.length][y.length]; int[][]c=new int[x.length][y.length]; for(int i=1;i<x.length;i++) { for(int j=1;j<y.length;j++) { if(x[i]==y[j]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=1; } else if(c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=0; } else { c[i][j]=c[i][j-1]; b[i][j]=-1; } } } return b; } public static void Display(int[][]b,String []x,int i,int j) { if(i==0||j==0) return; if(b[i][j]==1) { Display(b,x,i-1,j-1); count++; System.out.print(x[i]+""); } else if(b[i][j]==0) { Display(b,x,i-1,j); } else if(b[i][j]==-1) { Display(b,x,i,j-1); } }}