D. Walk on Matrix 位运算

题目链接

参考自:博客

题中DP为每次取大值,以求整体最大值,但是AND运算不符合此性质,

多个数AND运算,类似于取gcd,若某个位在所有数中都为1,则结果中的该位为1.

构造一个矩阵,使dp出来为0,正确值为k,则符合题意

然后发现一个规律:

8= 1000(2)

6=110(2)

(1000)&(110) = 0

(110)&(110)=110

设cnt=k的二进制长度

m=1<<cnt

借用上述规律构造矩阵

该路径算出来为0;

正确路径算出来为k;

 

#include<bits/stdc++.h> 
using namespace std;
int n,m;
int a[503][503];
int dp[503][503];
int main()
{
	scanf("%d",&n) ;
	int cnt=0;
	int nn=n;
	while(n)
	{
		cnt++;
		n/=2;
	}
	n=nn;
	int m=1<<cnt;
	printf("3 4\n");
	printf("%d %d %d 0\n",n+m,n,n+m);
	printf("%d %d %d 0\n",m,0,n+m);
	printf("%d %d %d %d\n",n+m,n+m,n+m,n);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值