HDU 4175 Class Schedule (暴力+一点dp)

HDU 4175

题意:有C座楼,每座楼有T个教室。一个人须要訪问C个教室。每座楼仅仅能訪问一个教室。

訪问教室须要消耗能量,从x点走到y点须要消耗abs(x-y)的能量,最后要走到目的点L,问最后走到目的点L须要消耗的最少能量。

思路:读清题意,用getchar()的方式去读。。

此外英文阅读水平比較拙计,亟待提升,以后不能再直接用有道翻译来做题了。

直接暴力枚举。用dp[i][j]表示class = i , classroom = j的所需最小能量。

dp[i][j] = dp[i-1][k] + abs(e[i-1][k].pos - e[i][j].pos) + e[i][j].cost;

直接看代码吧:)

code:

/*
* @author Novicer
* language : C++/C
*/
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
#define inf 20000000
using namespace std;
const double eps(1e-8);
typedef long long lint;

struct cl{
	int pos;
	int cost;
};
cl e[30][1005];
int dp[30][1005];//dp[i][j]表示class = i , classroom = j的所需最小能量

int main(){
//	freopen("input.txt","r",stdin);
	int kase;
	cin >> kase;
	while(kase--){
//		memset(e,0,sizeof(e));
		memset(dp,0,sizeof(dp));
		int c,t,l;
		cin >> c >> t >> l;
		for(int i = 1 ; i <= c ; i++){
			for(int j = 1 ; j <= t ; j++){
				scanf("%d%d",&e[i][j].pos,&e[i][j].cost);
			}
		}
		for(int i = 1 ; i <= c ; i++){
			for(int j = 1 ; j <= t ; j++){
				int tmp = inf;
				for(int k = 1 ; k <= t ; k++){
					dp[i][j] = dp[i-1][k] + abs(e[i-1][k].pos - e[i][j].pos) + e[i][j].cost;
					tmp = min(dp[i][j] , tmp);
				}
				dp[i][j] = tmp;
//				cout << dp[i][j] << endl;
			}
		}
		int ans = inf;
		for(int i = 1 ; i <= t ; i++){
			int value = dp[c][i] + abs(l - e[c][i].pos);
			ans = min(ans , value);
		}
		cout << ans << endl;
	}
	return 0;
}
时间: 2024-08-06 01:18:02

HDU 4175 Class Schedule (暴力+一点dp)的相关文章

HDU - 2089 不要62 (暴力或数位DP)

Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众. 不吉利的数字为所有含有4或62的号码.例如: 62315 73418 88914 都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列. 你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新

hdu 4824 Disk Schedule(双调欧几里得旅行商问题)

题目链接:hdu 4824 Disk Schedule 题目大意:中文题. 解题思路:需要的时,很明显每到一层是要读取一次数据的,但是因为需要返回00,所以有些层的数据可以在返回的过程中读取会较优.于是转化成了双调欧几里得旅行商问题. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int N = 1

HDU 4960 Another OCD Patient 简单DP

思路: 因为是对称的,所以如果两段是对称的,那么一段的前缀和一定等于另一段的后缀和.根据这个性质,我们可以预处理出这个数列的对称点对.然后最后一个对称段是从哪里开始的,做n^2的DP就可以了. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algori

[HDOJ5890]Eighty seven(暴力,dp,bitset)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5890 题意:50个数,10W个询问,每次问删掉第i,j,k个数后,是否存在一种选10个数和为87的方案,只需要输出 ’Yes’ 或者 ’No’ 题解:暴力:不同的询问大概2W个,每个暴力bitset DP,抠一抠能卡着过.优化1:先求出一组解,如果询问和解没交就是’Yes’,否则暴力,不同的询问大概1W个:优化2:先预处理出所有询问的答案,能方便的复用之前的DP数组,不用每次从头开始重新求. 学了一

BestCoder Round #3 A hdu 4907 Task schedule

Task schedule                                                                        Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 307    Accepted Submission(s): 160 Problem Description 有一台机器

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

HDU 1024 Max Sum Plus Plus --- dp+滚动数组

HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值,其中第i个子序列包括a[j], 则max(dp[m][k]),m<=k<=n 即为所求的结果 <2>初始状态: dp[i][0] = 0, dp[0][j] = 0; <3>状态转移: 决策:a[j]自己成为一个子段,还是接在前面一个子段的后面 方程: a[j]直接接在前面

hdu 5623 KK&#39;s Number(dp)

问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10?4??)个数,每次KK都会先拿数.每次可以拿任意多个数,直到NN个数被拿完.每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终KK的得分减去对手的得分会是多少? 输入描述 第一行一个数T\left( 1\leq T\leq 10\right)T(1≤T≤10),表示数据组

hdu 2147 kiki&#39;s game(DP(SG)打表找规律)

题意: n*m的棋盘,一枚硬币右上角,每人每次可将硬币移向三个方向之一(一格单位):左边,下边,左下边. 无法移动硬币的人负. 给出n和m,问,先手胜还是后手胜. 数据范围: n, m (0<n,m<=2000) 思路: dp[i][j]=0,说明从(i,j)这个点到时左下角先手败.dp[i][j]=1则先手胜. 然后记忆搜.但是记忆搜会超时. 搜完把整张表打出来,发现规律了,,,,然后,,,代码剩几行了. 代码: ///打表观察 /* int f[2005][2005]; int go(in