链家编程题

题目是这样的,一个序列上有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);
           }
      }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值