下面是对矩阵消除游戏的题解,且这是属鼠第一次写题解,作一个开端。
using namespace std;
int a[20][20];
int lie[20];
int cnt ,n , m , k;//这里定义的全局变量也很关键
int calc(int st){
int sum = 0;
for (int i = 1 ; i <= n; i ++ ){
if (((st>>(i-1))& 1)== 1) {
cnt++;
for (int j = 1;j <= m;j++)
sum+=a[i][j];
}
else {
for (int j = 1; j <= m; j ++ )
lie[j] += a[i][j];
}
}//这个for循环其实很巧妙,主体功能是检索一个01串中的1来依次表示行号的选择情况,进而更具体地进行每一种选定情况下lie数组的维护
return sum;
}
bool comp(int a,int b){
return a > b;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
int sum = 0 , ans = 0;
for (int i = 1; i <= n ; i ++ ){
for (int j = 1 ; j <= m; j ++ ){//第一处错误,这里把判断条件里的j写成了i,导致其余部分检查怀疑了n遍都无济于事
scanf("%d",&a[i][j]);
sum += a[i][j];
}
}
if (k >= m || k >= n) {
printf("%d",sum);
return 0;
}
for (int st = 0; st < (1<<n); st ++ ){
cnt = 0;//对计数变量的初始化
memset(lie,0,80);//第二处错误,这里的sizeof输出的是字节数,而非简单的数量;
另外,这里是每一次for循环前对lie数组的初始化,也挺关键的
int sum2 = calc(st);
int res = k - cnt ;
if (res < 0 || res > k) continue;
sort(lie+1, lie+1+m,comp);
for (int i = 1; i <= res ; i ++)
sum2 += lie[i];
ans = max(ans,sum2);
}
printf("%d\n",ans);
return 0;
}*
总之,此题耗费良久,本人熟记于心