JOI 2012 - 暑い日々(問題4)

精進が必要だと思った問題.
dpだとは思っていましたが,鍛錬不足で全探索していた屑です.
前提として,C[n]をn番目の服の派手さとします.
i日目にj番目の服を着るときの価値の最大をdp[i][j]とします.
i-1日目にkという服を来たとして,
dp[i][j] = max(dp[i][j], dp[i-1][k]+abs(C[k]-C[j]))という漸化式を立てます.
あとはDPで解くだけです.

#include<iostream>
#include<algorithm>
#include<cmath>

struct Clothes{
	int max_t, min_t, value;
};

const int INF = 1 << 24, MAX_D = 201, MAX_N = 200;
int dp[201][200], t[201], cs[200][3];
//cs 0 max_t 1 min_t 2 派手さ

int main(){
	int d, n;
	std::cin >> d >> n;
	for(int i=1;i<=d;i++){
		std::cin >> t[i];
	}
	for(int i=0;i<n;i++){
		std::cin >> cs[i][0] >> cs[i][1] >> cs[i][2];
	}

	for(int i=1;i<=d;i++){
		std::fill(dp[i], dp[i]+n, -INF);
	}

	for(int i=0;i<n;i++){//1日目
		if(cs[i][0] <= t[1] && t[1] <= cs[i][1]){
			dp[1][i] = 0;
		}
	}

	int res = -INF;
	for(int i=2;i<=d;i++){//2日目以降
		for(int j=0;j<n;j++){
			if(cs[j][0] <= t[i] && t[i] <= cs[j][1]){
				for(int k=0;k<n;k++){
					dp[i][j] = std::max(dp[i][j],
															dp[i-1][k]+abs(cs[k][2]-cs[j][2]));
					res = std::max(res, dp[i][j]);
				}
			}
		}
	}

	std::cout << res << std::endl;
}