hdu3516 --- 四边形不等式优化

来源:互联网 发布:安装战网传输数据失败 编辑:程序博客网 时间:2024/04/27 23:43

其实这一题还是没有完全证明,因为赵爽的了论文里面是w(i , j) 一定要是相同的,而对于这一题,其实转移方程和k的选择不同而w不同,但是运用四边形不等是因该也没错.

四边形不等是的实质就是解的单调性...很多时候都可以这样做.使用解的单调性或者是凸性来优化DP转移.

#include <stdio.h>#include <string>#include <string.h>#include <queue>#include <stack>#include <map>#include <iostream>#include <stdlib.h>#include <math.h>#include <set>#include <algorithm>#define inf 0x3f3f3f3f#define mem0(x , y)  memset(x , y , sizeof(x))#define ll long long#define LL long long#define rep(x , y)   for(int x=0;x<y;x++)#define per(x , y)   for(int x=y-1;x>=0;x--)#define lowbit(x) (x & (-x))#define read(x) scanf("%d",&x)#define readt(i) int i ; scanf("%d" , &i)#define print(x) printf("%d\n" , x) ;#define middle int mid = (l + r)/2#define lson rt<<1 , l , mid#define rson rt<<1|1 , mid+1, r#define CASE int T ; int ca = 0 ; read(T) ; while(T--)#define RT tree[rt]#define FP freopen("1" , "r" , stdin)#define mem0(x , y) memset(x , y , sizeof(x))#define BIN(x) ll bin ; bin = (ll)1 << x ; ///2的x次方#define E Edge[i]#define lowbit(x) (x & (-x))const int MAXN = 500000 ;const int MAXV = 200000 ;const int MAXE = 200000 ;const int mod  = 1e8+7  ;using namespace std ;/****************前向星****************struct edge{    int s , e , w , next ;    bool operator < (const edge & e) const{        return w < e.w ;    }}Edge[MAXE] ;int head[MAXV] , hct = 0 ;void add_edge(int s,int e,int w){    Edge[hct].s = s ; Edge[hct].e =e ;Edge[hct].w = w ; Edge[hct].next = head[s] ;    head[s] = hct ++ ;}/*************************************/struct node{    int a, b ;    bool operator < (const node & n) const{        return a < n.a ;    }}s[2000] ;int sum[2000][2000] ;int dp[2000][2000] ;int main(){    int n ;    freopen("1" , "r" ,stdin) ;    ///freopen("A" , "w" ,stdout) ;    while(read(n)!=EOF){        rep(i , n) {            readt(ta) ; readt(tb) ;            s[i].a = ta ; s[i].b = tb ;        }        sort(s , s+n) ;        mem0(dp , inf) ;        for(int i=0;i<n;i++) dp[i][i] = 0 , sum[i][i] = i ;        for(int l=2;l<=n;l++){            for(int i=0;i+l-1<n;i++){                int r = i+l-1;                for(int k=sum[i][r-1] ; k<=min(sum[i+1][r],r-1) ; k++){                    ///printf("%d %d\n" ,dp[i][k] , dp[k+1][r]) ;                    ///printf("%d %d %d %d %d\n" , k,s[r].a,s[i].a,s[r].b ,s[i].b) ;                    int tmp = dp[i][k] + dp[k+1][r] + s[k+1].a - s[i].a                    + s[k].b - s[r].b ;                    if(dp[i][r] >= tmp){                        dp[i][r] = tmp ; sum[i][r] = k ;                    }                }                ///printf("dp[%d][%d] = %d\n" , i, r , dp[i][r]) ;            }        }        printf("%d\n" ,dp[0][n-1]) ;    }}


0 0
原创粉丝点击