HDU 3865 A Hard Journey 2011 Multi-University Training Contest 3 Host by BIT
(2011-07-20 10:12:44)
标签:
hdu3865ahardjourneyit |
分类: 动态规划 |
题目描述:
给你n*n的大格子,每个大格子里面有m*m个小格子,每个小格子里面是0或者1.
额。。。描述起来好麻烦,自己看题吧。。。
解题报告:
dp[i][j][0]表示到达并消灭完ij大格子后面向下的最小花费。
dp[i][j][1]表示到达并消灭完ij大格子后面向右的最小花费。
need[i][j][0]表示横扫ij大格子的花费。
need[i][j][1]表示纵扫ij大格子的花费。
small[i][j]表示通过横红转换一次后消灭ij大格子的花费(对每个大格子二分匹配就能得到)
那么i,j可以由dp[i - 1][j][0]和dp[i][j - 1][1]转移过来。
对于dp[i - 1][j][0]:
dp[i][j][0] = min(dp[i][j][0], need[i][j][0], need[i][j][1] + q +
q, small[i][j] + q + q);
dp[i][j][1] = min(dp[i][j][1], need[i][j][0] + q, need[i][j][1] +
q, small[i][j] + q);
比较容易理解。
对于dp[i - 1][j][1]:一样。
写的比较麻烦,最好等看解题报告标称吧。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int x[20][20][15][15], n, m, p, q, need[20][20][2],
small[20][20];
int dp[20][20][2], match[20], g[20][20];
bool vst[20], equ[20][20];
int find(int u, int m)
{
}
int solve(int n)
{
}
int main()
{