■
JOI2012予選4「Hot Days」
解けたので、備忘録のため、コードを適当に貼ります(ひどい)。
コードの貼り方が分からないので、この記事は何回か更新されます。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int d, n;
int t[200];
int a[200], b[200], c[200];
int dp[201][200]; //dp[day][fuku] = sumの最大値
int ans = -1145141919;
void makeAns(){
int day, fuku, i;
//初期化
for( day = 0; day < d + 1; day++ ){
for( fuku = 0; fuku < n; fuku++ )
dp[day][fuku] = -114514;
}
for( fuku = 0; fuku < n; fuku++ ){
if( a[fuku] <= t[0] && t[0] <= b[fuku] )
dp[1][fuku] = 0; //0日目に服fukuを着た場合
}
//dp配列の更新
for( day = 1; day < d; day++ ){
for( fuku = 0; fuku < n; fuku++ ){
//day日目の服を決める(遷移)
for( i = 0; i < n; i++ ){
if( a[i] <= t[day] && t[day] <= b[i] ){
//day日目に服iを着る
dp[day + 1][i] = max(dp[day + 1][i], dp[day][fuku] + abs(c[fuku] - c[i]));
}
}
}
}
//答えを計算する
for( i = 0; i < n; i++ ){
ans = max(ans, dp[d][i]);
}
}
int main()
{
int i, j;
cin >> d >> n;
for( i = 0; i < d; i++ ) cin >> t[i];
for( i = 0; i < n; i++ ) cin >> a[i] >> b[i] >> c[i];
makeAns();
cout << ans << endl;
return 0;
}