hdu 5009 離散化 鍊錶 dp

2021-06-28 15:56:13 字數 1041 閱讀 2275

1.這道題因為顏色給的資料範圍大於資料總數,所以要對顏色進行離散化後再進行操作.

2.而這道題每次更新,可以用鍊錶記錄當前情況下每種顏色最靠近當前位置的所在位置後,因為最終花費是c*c,所以每乙個所選區間的顏色數不能大於sqrt(區間長度),所以可以得到n*sqrt(n)複雜度演算法的動態規劃如下:

dp[i] = min ( dp[i] , dp[j] + cnt*cnt);

ac**如下:

#include #include #include #include #include #define max 50007

using namespace std;

typedef long long ll;

int dp[max];

int c[max];

int a[max];

int pos[max];

int loc[max];

struct node

}b[max];

struct list

list[max];

int n,head,num;

void add ( int v )

head = num++;

}void erase ( int v )

int main ( )

}sort ( b+1 , b+cc+1 );

int color = 1;

c[b[1].id]=1;

for ( int i =2 ; i <= cc; i++ )

memset ( loc , -1 , sizeof ( loc ) );

memset ( pos , -1 , sizeof ( pos ) );

head = -1 , num = 0;

dp[0] = 0;

add ( 0 );

int cnt,maxn;

for ( int i = 1 ;i <= cc ; i++ )

}printf ( "%d\n" , dp[cc] );

}}

HDU 3607 線段樹 離散化 DP

n個連續的盒子,每個盒子有高度h和價值v,選擇任意一點進入,且從任意一點出來,進入後只能從左向右走,且每次走到的盒子高度必須更高,可以跳過低的盒子 狀態轉移方程 dp i max dp j v i 0 jh j 用線段樹優化,尋找 j include stdio.h include string.h...

hdu5542 樹狀陣列 離散化 dp

推薦 通過離散化 樹狀陣列 優化 include using namespace std const int mod 1e9 7 const int maxn 1e3 60 int s maxn 最初的陣列 int e maxn 排序後的書序 int num maxn 儲存 離散化後的位置 int ...

HDU 2836 離散化DP 區間優化

題目鏈結 題目大意 計算序列有多少種組合,每個組合至少兩個數,使得組合中相鄰兩個數之差不超過h,序列有重複的數。mod 9901。解題思路 以樣例1 3 7 5為例,如果沒有重複的數。設dp i 前n個數的方案數,初始化為1。那麼for 1.i.n dp i sum dp j 1 quad,wher...