MnZn求助(真的很急),区间dp,但是只能A前四个点……
查看原帖
MnZn求助(真的很急),区间dp,但是只能A前四个点……
510555
ImposterAnYu楼主2022/10/16 17:52
#include<bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#define N 1005
#define M 105
#define MAXT 2005
#define mod 1000000007
#define int1 int
using namespace std;
int1 n,k,m,i,j,l,len,d,dp[M][M][MAXT][2],ans = -1145141919,maxt,mm;
//dp[i][j][l][0/1] 表示已经走了 [i,j] 这段区间(已离散化),花了 l 秒,目前在 k 的左/右边的答案。 

struct owo{
	int1 x,b,t;
} a[M];
bool cmp(owo x,owo y){
	if(x.x == y.x){
		return x.t < y.t;
	}
	return x.x < y.x;
}

int1 read(){
    int1 x = 0,f = 1;
    char ch = getchar();
    while(!isdigit(ch)){
        if(ch == '-'){
            f = -1;
        }
        ch = getchar();
    }
    while(isdigit(ch)){
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x * f;
}
void print(int1 x){
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9){
        print(x / 10);
    }
    putchar(x % 10 + 48);
    return ;
}
int main(){
	//freopen("go.in","r",stdin);
	//freopen("go.out","w",stdout);
	n = read(),k = read(),m = read() + 1,a[m] = {k,0,1};
	for(i = 1; i < m; i++){
		a[i].x = read(),a[i].b = read(),a[i].t = read(),maxt = max(maxt,a[i].t);
	}
	sort(a + 1,a + m + 1,cmp);
	for(i = 0; i <= 100; i++){
		for(j = 0; j <= 100; j++){
			for(l = 0; l <= 2000; l++){
				dp[i][j][l][0] = dp[i][j][l][1] = -1145141919;//初始化。 
			}
		}
	}
	/*
	for(i = 1; i <= m; i++){
		cout<< a[i].x << " " << a[i].b << " " << a[i].t << endl;
	}
	*/
	for(i = 1; i <= m; i++){
		if(!a[i].b){
			dp[i][i][1][0] = dp[i][i][1][1] = 0;//找到起点。 
			break;
		}
	}
	for(len = 2; len <= m; len++){
		mm = m - len + 1;
		for(i = 1; i <= mm; i++){
			j = i + len - 1;
			for(l = maxt; l >= 1; l--){
				d = abs(a[i + 1].x - a[i].x);
				if(l > d){
					dp[i][j][l][0] = max(dp[i][j][l][0],dp[i + 1][j][l - d][0] + (l <= a[i].t) * a[i].b),ans = max(ans,dp[i][j][l][0]);
				}
				d = abs(a[j].x - a[i].x);
				if(l > d){
					dp[i][j][l][0] = max(dp[i][j][l][0],dp[i + 1][j][l - d][1] + (l <= a[i].t) * a[i].b),ans = max(ans,dp[i][j][l][0]);
				}
				d = abs(a[j - 1].x - a[j].x);
				if(l > d){
					dp[i][j][l][1] = max(dp[i][j][l][1],dp[i][j - 1][l - d][0] + (l <= a[j].t) * a[j].b),ans = max(ans,dp[i][j][l][1]);
				}
				d = abs(a[j].x - a[i].x);
				if(l > d){
					dp[i][j][l][1] = max(dp[i][j][l][1],dp[i][j - 1][l - d][1] + (l <= a[j].t) * a[j].b),ans = max(ans,dp[i][j][l][1]);
				}
				//cout<< i << " " << j << " " << l << " " << dp[i][j][l][0] << " " << dp[i][j][l][1] << endl;
			}
		}
	}
	print(ans);
	return 0;
}
2022/10/16 17:52
加载中...