zoukankan      html  css  js  c++  java
  • ZOJ 3555 Ice Climber(dp)

    晦涩的题意+各种傻逼害我调了那么久,实际上题目就是一个dp[i][j],dp[i][j]表示第i层第j个最少需要多少时间,当我们去更新dp[i][j]的时候,考虑的是从第i+1层的某一个dp[i+1][k]往上顶一层,然后走到dp[i][j]的位置,当然往上跳的时候要注意不要碰到怪物墙壁,各种坑,我的码力果然不行呀- -0

    #pragma warning(disable:4996)
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<vector>
    #include<cmath>
    #define maxn 2500
    #define maxw 220
    using namespace std;
    
    int dp[maxn][maxw];
    char num[maxn][maxw];
    char type[maxn][maxw];
    int n, w;
    int t1, t2, t3;
    
    int main()
    {
    	while (cin >> n >> w)
    	{
    		scanf("%d%d%d", &t1, &t2, &t3);
    		for (int i = 1; i <= n; i++){
    			scanf("%s", type[i] + 1);
    			scanf("%s", num[i] + 1);
    		}
    		memset(dp, 0x3f, sizeof(dp));
    		dp[n][1] = 0; int tmp = 0;
    		//if (type[n][1] == '|' || num[n][1] == '0'||type[n][1]=='#') dp[n][1] = 0x3f3f3f3f;
    		for (int i = 2; i <= w; i++){
    			if (dp[n][1] == 0x3f3f3f3f) break;
    			if (type[n][i] == '|' || num[n][i] == '0'){
    				break;
    			}
    			if (type[n][i] == '#') tmp += t3;
    			tmp += t1;
    			dp[n][i] = tmp;
    		}
    		for (int i = n - 1; i >= 1; i--){
    			for (int j = 1; j <= w; j++){
    				if (type[i][j] == '|'||num[i][j]=='0') continue;
    				int k = j - 1;
    				int cost = 0;
    				if (type[i][j] == '#') cost += t3;
    				bool flag = false;
    				while (k >= 1){
    					if (type[i][k] == '|') break;
    					if (num[i][k] == '0'){
    						flag = true;
    					}
    					if (type[i][k +1] != '#') dp[i][j] = min(dp[i][j], dp[i + 1][k] + cost + (num[i][k] - '0' + 1)*t2);
    					if (type[i][k] == '#') cost += t3;
    					cost += t1;
    					k--;
    					if (flag) break;
    				}
    				k = j + 1;
    				cost = 0;
    				flag = false;
    				if (type[i][j] == '#') cost += t3;
    				while (k <= w){
    					if (type[i][k] == '|') break;
    					if (num[i][k] == '0'){
    						flag = true;
    					}
    					if (type[i][k - 1] != '#') dp[i][j] = min(dp[i][j], dp[i + 1][k] + cost + (num[i][k] - '0' + 1)*t2);
    					if (type[i][k] == '#') cost += t3;
    					cost += t1;
    					k++;
    					if (flag) break;
    				}
    			}
    		}
    		int ans = 0x3f3f3f3f;
    		for (int i = 1; i <= w; i++){
    			ans = min(dp[1][i], ans);
    		}
    		if (ans == 0x3f3f3f3f) puts("-1");
    		else cout << ans << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    《大道至简》3
    《大道至简》2
    《大道至简》1
    [转]python 中的字符串连接
    [转]Eclipse Python插件 PyDev 使用
    [转]Windows下python环境变量配置
    [转]aircrack-ng破解教程
    [转]Java获取当前路径
    [转]java程序打包成jar,图片文件问题
    关于2013,致2014
  • 原文地址:https://www.cnblogs.com/chanme/p/3627408.html
Copyright © 2011-2022 走看看