现在有一块长条形的土地,这个土地我们可以看成是由n块小方格连接而成的(这些小方格我们可以将之编号为1到n)。而我们需要将其划分成两个部分,分别种上不同的作物(即作物A和B),划分必须在某两个小方格之间进行,或者在土地的最左端或最右端,若划分在第i块到第i+1块间进行,则划分后,第1至第i块地种A,剩下的地种B。现在有一些专家对土地进行了检测,他们每个人评估了每块土地适合种的作物。请你找到一个合适的划分,使得其与所有专家的评估最吻合,也就是说,你划分到A而专家评估为B的次数和你划分到B而专家评估为A的次数之和最小。
import java.util.*;
public class Partition {
private void init(int a[]){
for(int i=0,len=a.length;i<len;i++){
a[i]=0;
}
}
public int[] getPartition(int[][] land, int n, int m) {
int a[]=new int[n];
int b[]=new int[n];
init(a);
init(b);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(land[i][j]==0){
a[j]++;
}else{
b[j]++;
}
}
}
for(int i=1;i<n;i++){
b[i]+=b[i-1];
}
for(int i=n-2;i>=0;i--){
a[i]+=a[i+1];
}
int minx=a[0];
int res[]=new int[]{0,1};
for(int i=0;i<n-1;i++){
int sum=b[i]+a[i+1];
if(minx>sum){
minx=sum;
res=new int[]{i+1,i+2};
}
}
if(minx>b[n-1]){
minx=b[n-1];
res=new int[]{n,n+1};
}
return res;
}
}