链家编程题

来源:互联网 发布:三维平面布置图软件 编辑:程序博客网 时间: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);           }      }}