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]) ;
    }
}

 

posted @ 2017-10-09 13:14  天翎月  阅读(158)  评论(0编辑  收藏  举报