您的位置:首页 > 其它

递推DP URAL 1119 Metro

2015-05-06 19:34 357 查看
题目传送门

 /*
题意:已知起点(1,1),终点(n,m);从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0);
递推DP:仿照JayYe,处理的很巧妙,学习:)
好像还要滚动数组,不会,以后再补
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

const int MAXN = 1e3 + 10;
const int INF = 0x3f3f3f3f;
double dp[MAXN][MAXN];
int used[MAXN][MAXN];
int a[MAXN][MAXN];

int main(void)        //URAL 1119 Metro
{
freopen ("C.in", "r", stdin);

int n, m, k;
while (scanf ("%d%d", &n, &m) == 2)
{
scanf ("%d", &k);
int u, v;
memset (used, 0, sizeof (used));
while (k--)    {scanf ("%d%d", &u, &v);    used[u][v] = true;}

for (int i=0; i<=n; ++i)
{
for (int j=0; j<=m; ++j)
{
if (!i && !j)    dp[i][j] = 0;
else if (!i)    dp[1][j] = dp[1][j-1] + 1;
else if (!j)    dp[1][j] = dp[0][j] + 1;
else    dp[1][j] = min (dp[1][j-1], dp[0][j]) + 1;
if (used[i][j])    dp[1][j] = min (dp[0][j] + 1, dp[0][j-1] + sqrt (2.0));
}
}

printf ("%.0f\n", dp[1][m] * 100);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: