题目是这样的,一个序列上有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);
}
}
}