题目链接:http://codeforces.com/contest/313/problem/D
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 310;
int a[maxn][maxn]; ///a[i][j]表示从i到j的这条路的最低消耗
long long dp[maxn][maxn]; ///f[i][j]表示i个点中取j个点的最低消耗
int main(){
memset(a,-1,sizeof(a)); ///先标记为oo
int n,m,k; cin>>n>>m>>k;
while(m--){
int l,r,c; cin>>l>>r>>c;
if(a[l][r]==-1||c<a[l][r])
a[l][r]=c;
}
///可能存在l<=l2<=r2<=r时a[l][r]<a[l2][r2]这样的情况
for(int i=1; i<=n; ++i)
for(int j=i+1; j<=n; ++j) {
if(a[i][j]==-1) continue;
for(int ii=i; ii<=j; ++ii)
for(int jj=ii;jj<=j;++jj)
if(a[ii][jj]==-1|| a[ii][jj]>a[i][j])
a[ii][jj]=a[i][j];
}
memset(dp,-1,sizeof(dp)); ///先标记为oo
dp[0][0]=0;
for(int i=1; i<=n; ++i){
dp[i][0]=0; ///从i个中取0个时消费总是0
for(int j=1; j<=i; ++j){
dp[i][j]=dp[i-1][j];
for(int len=1; len<=j; ++len){///路长
if( a[i-len+1][i]==-1 )continue;
if(dp[i-len][j-len]==-1)continue;
if(dp[i][j]!=-1)
dp[i][j]=min( dp[i][j], dp[i-len][j-len]+a[i-len+1][i] );
else dp[i][j]=dp[i-len][j-len]+a[i-len+1][i];
}
}
}
///从 在n个中取了不小于k个时 的所有消耗中取最小
long long ans=dp[n][k];
for(int i=k;i<=n;++i)
if(dp[n][i]!=-1&&(ans>dp[n][i]||ans==-1))
ans=dp[n][i];
cout<<ans<<endl;
return 0;
}