↓ 跳过正文
  1. Posts/

HUST team contest #E A Mountain Road||poj 3846 (dp)

·840 字·2 分钟

比赛的时候以为是贪心…

想了好久.

不过最后没敢写,因为没办法证明正确性,只是直觉==

最后剩下的时间给队友改另一道题了..

果然明智…

蠢的人的直觉真心不靠谱..

这题是dp

我们可以把车按照方向的不同分为A车和B车

dp[i][j][0..1]表示已经经过了a方向的i辆车,经过了b方向的j辆车,并且最后一辆车是a/b方向的情况的离开道路的时间.

似乎问题不大.

然后就一直wa…

wa到怀疑人生好么!!!

最后发现

问题出在!

dp数组初始化赋值成正无穷的时候,溢出啦!

然后我搜了下,发现0x7fffffff果然不是什么好东西!

以后正无穷用0x3f3f3f3f

这东西>1E9,相加不超过int

而且最重要的是,如果定义 inf = 0x3f3f3f3f

0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))

不要使用0x7fffffff!

不要使用0x7fffffff!

不要使用0x7fffffff!

代码实现
  1/*************************************************************************
  2	> File Name: code/2015summer/0821/E.cpp
  3	> Author: 111qqz
  4	> Email: rkz2013@126.com
  5	> Created Time: 2015年08月21日 星期五 01时28分23秒
  6 ************************************************************************/
  7#include<iostream>
  8#include<iomanip>
  9#include<cstdio>
 10#include<algorithm>
 11#include<cmath>
 12#include<cstring>
 13#include<string>
 14#include<map>
 15#include<set>
 16#include<queue>
 17#include<vector>
 18#include<stack>
 19#define y0 abc111qqz
 20#define y1 hust111qqz
 21#define yn hez111qqz
 22#define j1 cute111qqz
 23#define tm crazy111qqz
 24#define lr dying111qqz
 25using namespace std;
 26#define REP(i, n) for (int i=0;i<int(n);++i)
 27typedef long long LL;
 28typedef unsigned long long ULL;
 29const int inf = 0x7fffffff;
 30const int N=2E2+7;
 31int dp[N][N][2];
 32int cntA,cntB;
 33struct Q{
 34    int beg,t;
 35    char dir;
 36}q[N],a[N],b[N];
 37void init(){
 38    int n;
 39    int beg,time;
 40    char dir;
 41    scanf("%d",&n);
 42     cntA = 0 ;
 43     cntB = 0 ;
 44    for ( int i = 0 ; i < n ;i++){
 45	cin>>q[i].dir>>q[i].beg>>q[i].t;
 46    }
 47    for ( int  i = 0 ; i < n ; i ++){
 48	if (q[i].dir=='A'){
 49	    cntA++;
 50	    a[cntA].beg = q[i].beg;
 51	    a[cntA].t = q[i].t;
 52	}
 53	else{
 54	    cntB++;
 55	    b[cntB].beg = q[i].beg;
 56	    b[cntB].t = q[i].t;
 57	}
 58    }
 59    for ( int i = 0 ; i <= cntA ; i ++){
 60	for ( int j = 0 ; j <= cntB ; j++){
 61	    dp[i][j][0]=dp[i][j][1]=inf/2; //正无穷溢出了....调了三个小时..妈蛋
 62	}
 63    }
 64    dp[0][0][0]=dp[0][0][1]=0;
 65}
 66void solve(){
 67    int l,r;
 68    l = r = 0 ;
 69    for ( int i = 0 ; i<= cntA ; i++){
 70	for ( int j = 0 ; j <= cntB ; j++){
 71	    l = dp[i][j][1]-10;
 72	    r = dp[i][j][1]-10;
 73	    for ( int k = i+1 ; k<=cntA ; k++){
 74 		l = max(l+10,a[k].beg);
 75		r = max(r+10,l+a[k].t);
 76		dp[k][j][0] = min (r,dp[k][j][0]);
 77	    }
 78	    l = dp[i][j][0]-10;
 79	    r = dp[i][j][0]-10;
 80	    for ( int k = j+1 ; k<=cntB ; k++){
 81	 	l = max(l+10,b[k].beg);
 82		r = max(r+10,l+b[k].t);
 83		dp[i][k][1] = min (r,dp[i][k][1]);
 84	    }
 85	}
 86    }
 87}
 88int main(){
 89    int T;
 90    cin>>T;
 91    while (T--){
 92	init();
 93	solve();
 94	int ans = 0 ;
 95	ans =  min (dp[cntA][cntB][0],dp[cntA][cntB][1]);
 96	//	printf("%d\n",ans);
 97	cout<<ans<<endl;
 98    }
 99	return 0;
100}

相关文章

codeforces 567 F. Mausoleum (dp)

·697 字·2 分钟
很容易看出来是dp 我们左右一起,一对一对放. 对于每一对,有三种方法,分别是两左,一左一右,两右. 初始区间长度为2n,每次放完后缩小区间长度 ,最后一定是放2个n,这个时候区间长度缩小为2,表明一种满足题意的情况.

codeforces 570 E. Pig and Palindromes (dp)

·940 字·2 分钟
比赛的时候想到了是dp搞… 不过dp废….. 可能更多的是心理上… 这道题并不怎么难想,但是以觉得是dp,就给了自己一种暗示…这题我搞不出来…

最大连续区间和的算法总结

·799 字·2 分钟
最大连续区间和是一个经典的问题。给定一个长度为 n 的序列 a[1],a[2]…a[n-1],a[n],求一个连续的子序列 a[i],a[i+1]…a[j-1],a[j],使得 a[i]+a[i+1]…a[j-1]+a[j]最大。