参考自:博客
题中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); }
D. Walk on Matrix 位运算
最新推荐文章于 2024-04-24 06:28:30 发布