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...