uvalive 6938 区间dp
Posted 天翎月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uvalive 6938 区间dp相关的知识,希望对你有一定的参考价值。
看到n范围和给的区间看着就像区间dp 然后怎么cmp感觉都没法进行区间合并
n的300误导了下 没有注意离散化之后对时间可以dp
然而这个dp感觉不太经得起证明的样子...
dp[i][j] -> 把完全包含在[i,j]里面的区间打完的cost
那么枚举裂缝 需要加上的是 跨越裂缝的区间的cost 这个没办法做
可以知道 如果有两个完全不相交的区间 它们肯定会分在裂缝的两边 所以不用管
所以我们只需要考虑那些 完全连接在一起的区间 选择最贵的一个打掉
而裂缝肯定在最贵的[l,r]里面
* 1 区间离散化不影响做题
* 2 不一定非要泛用决战型枚举裂缝
int a[305] , b[305] , c[305] ; int dp[605][605] ; int main () { int t = read() ; while(t -- ) { flc(dp,0) ; int n = read() ; vector<int> e ; rep(i,1,n) { a[i]=read(),b[i]=read(),c[i]=read(); e.pb(a[i]) , e.pb(b[i]) ; } sort(e.begin(),e.end()) ; e.erase(unique(e.begin(),e.end()),e.end()) ; rep(i,1,n) { a[i] = lower_bound(e.begin(),e.end(),a[i])-e.begin()+1 ; b[i] = lower_bound(e.begin(),e.end(),b[i])-e.begin()+1 ; } int m = e.size(); rep(len,2,m) { rep(i,1,m){ int j=i+len-1; if(j>m)break ; int C = -1 ; int l = -1 , r = -1 ; rep(k,1,n) { if(a[k] >= i && b[k] <= j) { if(C < c[k]) { l = a[k] , r = b[k] ; C = c[k] ; } } } if(l == -1) { dp[i][j] = 0 ; } else { dp[i][j] = 999999999 ; rep(k,l,r) { dp[i][j] = min(dp[i][j] , dp[i][k-1] + dp[k+1][j] + C) ; } } } } printf("%d\n" , dp[1][m]) ; } }
以上是关于uvalive 6938 区间dp的主要内容,如果未能解决你的问题,请参考以下文章
UVALive 4987---Evacuation Plan(区间DP)