ciao ,vi spiego in poche parole quello che vorrei fare:
in input ho:
data una matrice triangolare:
** j1 j2 j3 j4
j1:-1
j2: 2 -1
j3: 3 2 -1
j4: 4 2 3 -1

un array di 4 stringhe(lavori):
j1:abcd
j2:bca
j3:cabc
j4:abcd

e una matrice di interi: (in cui ogni valore è associato ai caratteri delle rispettive stringhe)
** j1 j2 j3 j4
j1:10 10 10 1
j2: 5 5 4 0
j3: 1 20 20 20
j4: 1 10 1 10

per ogni colonna della matrice triangolare: trovo il max valore ad esempio nel mio caso (4)che corrisponde agli indici [j1][j4],inserisco quindi j1 e j4 dell'array di stringhe in un array I1 e le stringhe j2 e j3 in un array I2.
dopo questo passo devo verificare se il peso delle stringhe di I1>del peso delle stringhe di I2,quindi dalla matrice di interi prendo (j1 e j4)=I1(peso) e faccio la somma dei valori,la stessa cosa con (j2 e j4)=I2 ,se I1(peso)>I2(peso) mi fermo e restituisco l'array di stringhe I1.

se invece I1<=I2,ripeto le operazioni non considerando la righa in corrispondenza del max precedente etrovando un nuovo massimo,nel mio caso (3)
corrisponde agli indici [j1][j3],inserisco quindi j3 dell'array di stringhe nell' array I1 quindi I1=(j1,j3,j4) e tolgo la stringa j3 dall'array I2,quindi I2=(j2)
dopo questo passo devo verificare se il peso delle stringhe di I1>del peso delle stringhe di I2,quindi dalla matrice di interi prendo (j1 e j4e j3)=I1(peso) e faccio la somma dei valori,la stessa cosa con I2 che adesso vale=(j2) ,se I1(peso)>I2(peso) mi fermo e restituisco l'array di stringhe I1.altrimenti proseguo...

Sto provando da un pò a vedere come implementare questo algoritmo ma con non poche difficoltà,questo il codice che ho scritto:ma eseguendolo mi stampa questo :
-1
2 -1
3 2 -1
4 2 3 -1
null
null
null
null

ma invece io voglio che mi ritorni un array di stringhe!!qualcuno mi sa dire dove sbaglio??perchè??grazie

codice:
package lcs;
public class Massimo {
	public static String [] InsiemeMaggiore(int [][] matrice,String [] job,int [][]tempoProc){
		int righa,colonna;
		int i,j;
		String[]I1 =new String[job.length];
		String[]I2 =new String[job.length];
		
		int max = -1;
		int [] indiceRigha  = new int[matrice.length];
		indiceRigha[0]=-1;//array non nullo
		/*scandisco le colonne e per ogni colonna 
		 * scandisco le righe e trovo il massimo della colonna j*/
		for(j=0; j<matrice[0].length;j++){
			int sommaI1=0;
			int sommaI2=-1;
			if(sommaI2>=sommaI1){
				for(i=j+1; i<matrice.length;i++){
					for(i=0;i<indiceRigha.length;i++){
						if((matrice[i][j]>max)&&(indiceRigha[i]!=i)){
							max=matrice[i][j];
						}
						colonna=j;
						righa=i;
						indiceRigha[i]+=righa;
						/*inserisco le rispettive stringhe in 
						 * corrispondenza del max trovato negli
						 *  arrayI1 e I2*/
						for(i=0;i<job.length;i++){
							if((i==righa)||(i==colonna)){
								I1[i]+=job[i];
							}
							else{
								I2[i]+=job[i];
							}
							int indexRimuovi=righa;
							I2[indexRimuovi]=I2[I2.length-1];
							I2 = ArrayRidimensionato.resize(I2, I2.length-1);
						}
						/*calcolo il tempo di processamento dei pesi associati
						 * alle stringhe che si trovano in I1 e I2
						 */
						for(i=0;i<tempoProc.length;i++){
					    	for(j=0;j<tempoProc[i].length;j++){
					    		if((i==righa)||(i==colonna)){
					    			sommaI1+=tempoProc[i][j];
					    			System.out.println(sommaI1);
					    		}
					    		else{
					    			sommaI2+=tempoProc[i][j];
					    			System.out.println(sommaI2);
					    		}
					    		sommaI2 -=tempoProc[i][j];
					    	}
					    }System.out.println(sommaI1);
					}
				}
			}
		}
		return I1;
	}
}
codice:
package lcs;
/*ridimensiona l'array eliminando la righa*/
public class ArrayRidimensionato {
	public static String[] resize(String[] oldArray,int newLength){
		if (newLength < 0)
			throw new IllegalArgumentException();
			String[] newArray = new String[newLength];
			int count = oldArray.length;
			if (newLength < count) count = newLength;
			for (int i = 0; i < count; i++)
			newArray[i] = oldArray[i];
			return newArray;
	}

}
codice:
package lcs;
public class provaLcs {
	public static void main(String[] args) {
	    String a ="abcd";
		String b ="bca";
		String c ="cabc";
		String d ="abcd";
	
		String[] job= new String []{a,b,c,d};
		int[][] m =new int[job.length][job.length];
		m=Matrice.mLunghezzaSottostringa(job);
		
		int[][] matrice =new int[][]{{10,10,10,1},{5,5,4,0},{1,20,20,20},{1,10,1,10}};
		String[]insieme=new String[matrice.length];
		insieme=Massimo.InsiemeMaggiore(m,job,matrice);
		for(int i=0;i<insieme.length;i++){
			System.out.println(insieme[i]+"");
		}
	}
}