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

比赛的时候以为是贪心...

想了好久.

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

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

果然明智...

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

这题是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!

/*************************************************************************
	> File Name: code/2015summer/0821/E.cpp
	> Author: 111qqz
	> Email: rkz2013@126.com 
	> Created Time: 2015年08月21日 星期五 01时28分23秒
 ************************************************************************/
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
#define y0 abc111qqz
#define y1 hust111qqz
#define yn hez111qqz
#define j1 cute111qqz
#define tm crazy111qqz
#define lr dying111qqz
using namespace std;
#define REP(i, n) for (int i=0;i<int(n);++i)  
typedef long long LL;
typedef unsigned long long ULL;
const int inf = 0x7fffffff;
const int N=2E2+7;
int dp[N][N][2];
int cntA,cntB;
struct Q{
    int beg,t;
    char dir;
}q[N],a[N],b[N];
void init(){
    int n;
    int beg,time;
    char dir;
    scanf("%d",&n);
     cntA = 0 ;
     cntB = 0 ;
    for ( int i = 0 ; i < n ;i++){
	cin>>q[i].dir>>q[i].beg>>q[i].t;
    }
    for ( int  i = 0 ; i < n ; i ++){
	if (q[i].dir=='A'){
	    cntA++;
	    a[cntA].beg = q[i].beg;
	    a[cntA].t = q[i].t;
	}
	else{
	    cntB++;
	    b[cntB].beg = q[i].beg;
	    b[cntB].t = q[i].t;
	}
    }
    for ( int i = 0 ; i <= cntA ; i ++){
	for ( int j = 0 ; j <= cntB ; j++){
	    dp[i][j][0]=dp[i][j][1]=inf/2; //正无穷溢出了....调了三个小时..妈蛋
	}
    }
    dp[0][0][0]=dp[0][0][1]=0;
}
void solve(){
    int l,r;
    l = r = 0 ;
    for ( int i = 0 ; i<= cntA ; i++){
	for ( int j = 0 ; j <= cntB ; j++){
	    l = dp[i][j][1]-10;
	    r = dp[i][j][1]-10;
	    for ( int k = i+1 ; k<=cntA ; k++){
 		l = max(l+10,a[k].beg);
		r = max(r+10,l+a[k].t);
		dp[k][j][0] = min (r,dp[k][j][0]);
	    }
	    l = dp[i][j][0]-10;
	    r = dp[i][j][0]-10;
	    for ( int k = j+1 ; k<=cntB ; k++){
	 	l = max(l+10,b[k].beg);
		r = max(r+10,l+b[k].t);
		dp[i][k][1] = min (r,dp[i][k][1]);
	    }
	}
    }
}
int main(){
    int T;
    cin>>T;
    while (T--){
	init();
	solve();
	int ans = 0 ;
	ans =  min (dp[cntA][cntB][0],dp[cntA][cntB][1]);
	//	printf("%d\n",ans);
	cout<<ans<<endl;
    }
	return 0;
}