题目描述
ファーマージョンは草を食べてからペースの臨時の変更を楽しむ便利な1 ... MラベルMの牛を有しています。牛のための御馳走として、ファーマージョンは1 ... NラベルNパイ(1≤N≤300)を、焼いています。牛iは、範囲内のラベル付きパイ(LIからRI包括的に)リチウム、RI]を楽しんで、そしてどの2頭の牛は、パイのまったく同じ範囲を享受しません。牛私はまた、範囲1 ... 106の整数であり、重量、WIを有します。
ファーマージョンは牛のC1、C2のシーケンスを選択することができ、...、CKは、その後、選択牛はその順番で食べるターンかかります。残念ながら、牛が共有する方法がわかりません!、区間内の残りのすべてのパイ[LCI、RCI]である - それは食べるために牛のCIのターンのとき、彼女は彼女が楽しんでいることをパイのすべてを消費します。ファーマージョンはそれが牛を食べることを向けるが、彼女は楽しんでパイの全てが既に消費されたときに厄介な事態が発生しないようしたいと思います。そのため、彼はあなたが、配列C1、C2、...、CKのシーケンス食べるの各牛少なくとも一つのパイの可能な最大総重量(WC1 + WC2 + ... + WCK)を計算したいと考えています。
得点:
テストケース2-5満足N≤50とM≤20。
テストケース6-9満たすN≤50。
输入
最初の行は二つの整数N及びM(1≤M≤N(N + 1)/ 2)を含有します。
次のM行それぞれは、Li、及びRI、WI整数の点で牛を記述する。
输出
有効なシーケンスの可能な最大総重量を印刷します。
サンプル入力
2 2
100 2.1
100 1 1
サンプル出力
200
提示
この例では、1人の食べる最初の牛なら、食べるために乳牛2のために何も残っはありません。しかし、2人の食べる最初の牛なら、乳牛1は第二のパイを食べることによって満たされます。
アイデア
見つけるために、最大範囲のDP範囲
コードの実装
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=305;
const int M=30;
const ll INF=1e18;
const ull sed=31;
const ll mod=1e9+7;
const double eps=1e-12;
typedef pair<int,int>P;
int n,m,dp[N][N],a[N][N],v[N][N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int w,l,r;
scanf("%d%d%d",&w,&l,&r);
dp[l][r]=a[l][r]=v[l][r]=w;
}
for(int len=2;len<=n;len++)
{
for(int l=1;l+len<=n+1;l++)
{
int r=l+len-1;
for(int k=l;k<=r;k++)
{
a[l][k]=max(max(a[l][k],a[l+1][k]),v[l][r]);
dp[l][r]=max(dp[l][r],dp[l][k-1]+dp[k+1][r]+a[l][k]);
}
}
}
printf("%d\n",dp[1][n]);
return 0;
}