dp[0][i][j]表示从i点出发,走最多j步返回i点的最优解。dp[1][i][j]表示从i点出发,走最多j步不返回i点的最优解。因此有:dp[0][u][j+2]=max(dp[0][u][j+2],dp[0][v][p]+dp[0][u][j-p]); //从u点出发,分配p步给子节点v走且返回到v,分配j-p给u点走且回到u,用2步来回u和v。dp[1][u][j+2]=max(dp[1][u][j+2],dp[0][v][p]+dp[1][u][j-p]);dp[1][u][j+1]=max(dp[1][u][j+1],dp[1][v][p]+dp[0][u][j-p]);dp[. Read More
posted @ 2013-10-25 21:48 MoriMiya Views(142) Comments(0) Diggs(0) Edit
状态压缩dp。一开始想开个dp[2][1024][1024]的数组,显然开不下,而且也会超时。因此把状态对应放在另外一个数组s里。map[i]表示用二进制表示第i行的地势情况,1是高地,0是平原。用dp[i][j][k]表示第i行,达到状态s[j],且i-1行的状态是s[k]的最优解。状态转移方程为 dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][p]+cnt[j]);满足状态转移方程的条件是 s[j]&map[i]==0,s[j]&s[k]==0,s[j]&s[p]==0,且dp[i-1][k][p]存在。//Memory:228K//T Read More
posted @ 2013-10-24 01:13 MoriMiya Views(209) Comments(0) Diggs(0) Edit