最近做了一个状压+动态规划的题,就是在连续M个长度判断是否有超过Q个的选择,状压处理,然后动态规划,主要的转移方程是
for(j=0;j<1<<m;j++)
{
if(check(j)>q)continue;
//printf("ssss %d",check(j));
if(j&1)
{
dp[i][j]=max(dp[i-1][j>>1],dp[i-1][(j>>1)+(1<<m-1)])+a[i];
}
else
dp[i][j]=max(dp[i-1][j>>1],dp[i-1][(j>>1)+(1<<m-1)]);
}
主要就是处理第i个位置的j状态,调用前面的j>>2和(j>>2)+(1<<(m-1))的状态,我做这个题的时候一直wrong,怎么都找不到错,最后对比了题解,发现是没有写括号。。+的优先级比>>高,所以必须加括号,我一直没有注意,所以就找了好久。。。。