11月30日

这几天主要是做状态压缩dp的题,第一道做的是Mondriaan's Dream ,题意是输入n和m表示一个n*m的矩形,用1*2的方块进行覆盖,不能重叠,不能越出矩形边界,问完全覆盖完整个矩形有多少种不同的方案,定义f[i,j]表示前i-1行已经完全覆盖,第i行的状态为j的时候的方案数。则f[i,j]+=f[i-1,k]。k能通过放置骨牌使第i-1行被完全覆盖,且第i行状态为j。这个状态转移可以用dfs来实现。先用dfs预处理出第一行可能的状态。对于第一行,只有两种可能操作:1、不放dfs(x+1,now shl 1); 2、横放dfs(x+2,now shl 2 or 3); 当x等于m+1时,说明得到了一种可行状态,当x大于m时,退出dfs。然后做放牛,题意是农夫FJ有一块n行m列的矩形土地, 有的土地是肥沃的,可以在这些土地上放牛(用1表示),有的土地不能放牛(用0表示),而且相邻的可以放牛的格子不能同时有牛,问FJ一共有多少种放牛的方案。用用1表示放牛,0表示不放牛dp[i][j] 就表示第i行状态为j时的方案数。假设当前状态为X,那么只需要判断X&(X>>1)或者X&(X<<1)的结果是不是0,如果是0,说明没有相邻的,否则就说明有相邻的。炮兵阵地也是相同的思想不过多了一维。 Most Powerful这道题,题目的意思是研究人员发现有N个原子两两组合会发生反应产生能量,且其中一个会被和谐掉,给出一个矩阵map,其中map[i][j]表示原子i与j发生反应且原子j被和谐掉所释放的能量,问给定的n个原子反应最多能产生多少能量。dp[state]表示当前已经消失的气体的状态为最大能量值,状态转移方程dp[state] = dp[state’]+value[i][j]j为消失了了的原子。Doing Homework 这道题题意是有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小,选了第i门功课,则二进制对应的位变为1,直到全部选完,更新最小值。打印时可以根据 dp[]保存的值去找,比如当前状态为now,第i门功课没选,如果dp[now]==dp[now+(1<

你可能感兴趣的:(训练日记)