Day2

Day2

UVA 1025 二维DP

题面

​ 【题目大意】某城市地铁是线性的,有n(2≤n≤50)个车站,从左到右编号1~n。有M1辆列车从第1站开始往右开,还有M2辆列车从第n站开始往左开。列车在相邻站台间所需的运行时间是固定的,因为所有列车的运行速度是相同的。在时刻0,Mario从第1站出发,目的在时刻T(0≤T≤200)会见车站n的一个间谍。在车站等车时容易被抓,所以她决定尽量躲在开动的火车上,让在车站等待的时间尽量短。列车靠站停车时间忽略不计,且Mario身手敏捷,即时两辆方向不同的列车在同一时间靠站,Mario也能完成换乘。 【输入格式】 输入文件包含数种情况,每一种情况包含以下7行:

第一行是一个正整数n,表示有n个车站 第二行是为T,表示Mario在时刻T见车站n的间谍 第三行有n-1个整数t1,t2,...,tn-1,其中ti表示地铁从车站i到i+1的行驶时间 第四行为M1,及从第一站出发向右开的列车数目 第五行包含M1个正整数a1,a2,...,aM1,即个列车出发的时间 第六行为M2,及从第一站出发向右开的列车数目 第七行包含M2个正整数b1,b2,...,bM2,即个列车出发的时间

最后一种情况以一行0结尾。

思路:

状态设计:dp[i][j] 表示人在i时刻在j站,所需要的等待时间

转移方程:dp[i][j] = min {dp[i+1][j]+1,dp[i+t[j+1]][j],dp[i+t[j-1]][j-1]},t[i]表示从i站到i+1站所需时间

DP代码:

	for(int i=tt-1;i>=0;i--)
		for(int j=n;j>=1;j--)
        {	
            dp[i][j]= dp[i+1][j]+1;
            if(i + t[j] < tt && j < n && has_car1(i,j))
                dp[i][j] = min(dp[i+t[j]][j+1],dp[i][j]);
            if(i + t[j-1]< tt && j > 1 && has_car2(i,j))
                dp[i][j] = min(dp[i+t[j-1]][j-1],dp[i][j]);
        }

今天写这道题的时候,感觉不能只把DP方程写出来就以为完事了,边界条件初始化、转移的时候一些条件的判断都是十分重要的。

UVA 437 DAG上的DP

题面

巴比伦人有n种长方形方块,每种有无限个,第i种方块的三边边长是xi,yi,zi,要求选一些立方体竖成一根尽量高的柱子,使得每个立方体的底面面积严格小于它下面的那个立方体底面面积

思路:

状态设计:dp(i,j)表示编号为i,高为j的立方体,在底面所能堆成的最高高度。

转移方程:dp[i][j] = max{dp[x][y]} + v[i]/j,

由于摆法不同,实际上这里一共是3n个方块

解法1: 通过记忆化搜索直接解。

解法2:排序之后,使用递推。

解法3:3N个方块,拓扑排序,然后遍历拓扑序来更新。

//今天真是糟糕的一天啊....

原文地址:https://www.cnblogs.com/backkom-buaa/p/11456258.html