• P2501 [HAOI2006]数字序列 (LIS,DP)(未完成)


    第二问好迷。。。

    #include "Head.cpp"
    #include <vector>
    
    const int N = 35007;
    
    vector<int> V[N];
    int a[N], b[N], f[N];
    int sum1[N], sum2[N], dp[N];
    int main(){
    	int n;
    	io >> n;
    	R(i,1,n){
    		io >> a[i];
    		a[i] -= i;
    	} 
    	a[++n] = 0x3f3f3f3f;
    	int len = 1;
    	b[len] = a[1];
    	f[1] = 1;
    	R(i,2,n){
    		if(a[i] >= b[len]){
    			b[++len] = a[i];
    			f[i] = len;
    		}
    		else{
    			int pos = upper_bound(b + 1, b + len + 1, a[i]) - b;
    			b[pos] = a[i];
    			f[i] = pos;
    		}
    	}
    	
    	printf("%d
    ", n - f[n]);
    	
        a[0] = -0x3f3f3f3f;
        V[0].push_back(0);
        R(i,1,n){
            dp[i] = 0x3f3f3f3f;
            for(vector<int>::iterator j = V[f[i] - 1].begin(); j != V[f[i] - 1].end(); ++j){
                if(a[*j] > a[i]) continue;
                sum1[*j - 1] = sum2[*j - 1] = 0;
                R(k,*j,i){
                    sum1[k] = sum1[k - 1] + Abs(a[i] - a[k]);
                    sum2[k] = sum2[k - 1] + Abs(a[*j] - a[k]);
                }
                R(k,*j,i){
                    dp[i] = Min(dp[i], dp[*j] - sum2[*j] - sum1[k] + sum2[k] + sum1[i]);
                }
            }
            V[f[i]].push_back(i);
        }
        
        printf("%d
    ", dp[n]);
    		
    	return 0;
    }
    
  • 相关阅读:
    省市级联
    innerText与innerHTML的区别
    使用代码提交表单
    Date的使用
    Array(数组)的使用
    [贪心]Rest Stops
    [数论][Miller_Rabin] Goldbach
    [简单思维题]Hoofball
    [数论][容斥原理]Co-prime
    [图论][二分图最大匹配]Courses
  • 原文地址:https://www.cnblogs.com/bingoyes/p/11365860.html
Copyright © 2020-2023  润新知