没有想到好的算法,用回溯法给爆破了。。。
public class ColorTheCells{ private int min_time; public int minimalTime(int[] dryingTime){ int len = dryingTime.length; int[] dryThen = new int[len]; int i; for(i=0;i<len;i++) dryThen[i] = 0; min_time = 0x7fffffff; for(i=0;i<len;i++) paint(dryThen,dryingTime,0,i,0); return min_time; } private void paint(int[] dryThen,int[] dryTime,int cur_cell,int next_cell,int cur_time){ //1.move to next_cell //2.paint //3.check time,then paint next or return //4.unpaint int len = dryThen.length; //step 1 while(cur_cell>next_cell+1){ //move left //wait to move if(dryThen[cur_cell - 1]>cur_time) cur_time = dryThen[cur_cell-1]; //move cur_time++; cur_cell--; } while(cur_cell<next_cell-1){ //move right //wait to move if(dryThen[cur_cell+1]>cur_time) cur_time = dryThen[cur_cell+1]; //move cur_time++; cur_cell++; } if(cur_cell==next_cell){ //move left or right if(cur_cell>0&&cur_cell<len-1){ if(dryThen[cur_cell-1]<dryThen[cur_cell+1]){ //wait left if(dryThen[cur_cell-1]>cur_time) cur_time = dryThen[cur_cell-1]; //move left cur_time++; cur_cell--; } else{ //wait right if(dryThen[cur_cell+1]>cur_time) cur_time = dryThen[cur_cell+1]; //move right cur_time++; cur_cell++; } } else if(cur_cell>0){ //wait left if(dryThen[cur_cell-1] > cur_time) cur_time = dryThen[cur_cell-1]; //move left cur_time++; cur_cell--; } else if(cur_cell<len-1){ //wait right if(dryThen[cur_cell+1]>cur_time) cur_time = dryThen[cur_cell+1]; //move right cur_time++; cur_cell++; } } //step 2 cur_time++; // System.out.println("paint"+next_cell+",time="+cur_time); dryThen[next_cell]=cur_time+dryTime[next_cell]; //step 3 if(cur_time>=min_time){ } else{ //paint all the unpainted cell int i,count=0; for(i=0;i<dryThen.length;i++){ //System.out.println(i); if(dryThen[i]==0){ paint(dryThen,dryTime,cur_cell,i,cur_time); count++; } } //log the new min_time if(count==0&&cur_time<min_time){ // System.out.println(cur_time); min_time = cur_time; } } //step 4 dryThen[next_cell]=0; } }