代码还是看别人的吧,我写的能跑就行。居然时间超限,明明学了一下午修修补补的,编译器君还真是严格呢~
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int m;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt(),M=scanner.nextInt(),K=scanner.nextInt();
m=M;
int[] dp=new int[1<<M];
Arrays.fill(dp,1,(1<<M),-1);
int[] status=new int[N+1];
for (int i = 1; i <=N; i++) {
for (int j = 0; j < K; j++) {
status[i]|=1<<(scanner.nextInt()-1);
}
}
for (int i = 1; i <=N; i++) {
for (int j = (1<<M)-1; j>=1; j--) {
int temp=lowestCount(j,status[i]);
if (dp[j]==-1&&dp[temp]==-1)continue;
if (dp[j]==-1||dp[temp]==-1)dp[j]=dp[j]==-1?dp[temp]+1:dp[j];
if (dp[temp]+1<dp[j])dp[j]=dp[temp]+1;
}
}
System.out.println(dp[(1<<M)-1]);
}
private static int lowestCount(int want,int have) {
int temp=1,i=want;
for (int j = 0; j < m; j++) {
if ((want&temp)!=0 && (have&temp)!=0)i-=temp;
temp<<=1;
}
return i;
}
}