/*
translation:
給出一列數列,問把這列數列變成非遞增或者非遞減的最小代價是多少。代價公式如下:
|a1 - b1| + |a2 - b2| + ... + |an - bn |。
solution:
dp, lis, 離散化
每個數要增加多少的量是不確定的,也就是有無窮種可能。但仔細考慮,要使得代價最少,增加後的量肯定
是原來的數列當中的數。因此先把原來數列排序。在用lis方法解決
note:
date:
2016.9.8
*/#include #include #include #define abs(a) ((a) > 0 ? (a) : -(a))
using namespace std;
const int maxn = 2000 +5;
const long long inf = 1e60;
long long dp[maxn][maxn]; //前i個,最後乙個高度為b[j]的最優解
int a[maxn], b[maxn], n;
int main()
sort(b, b + n);
for(int i = 0; i < n; i++) dp[0][b[i]] = 0;
long long t;
for(int i = 1; i < n; i++)
} long long ans = inf;
for(int i = 0; i < n; i++)
ans = min(ans, dp[n - 1][i]);
printf("%lld\n", ans);
}return 0;
}
離散化思想
離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 1,999,100000,15 處理後 1,3,4,2 原資料 處理後 include include include using nam...
離散化思想
最近做了一些需要離散資料的題目,比如ural 1019 以及poj 2528等,由於資料較大,如果用傳統的方法建立對應的資料結構消耗的記憶體和時間肯定是不能被接受的。由於以前沒有怎麼接觸過需要離散化的題目,於是就通過自己最近的做題經驗以及網上的部分資料,整理並講解了常用的離散資料的方法。何為離散化?...
離散化思想
離散化是什麼 一些數字,他們的範圍很大 0 1e9 但是個數不算多 1 1e5 並且這些數本身的數字大小不重要,重要的是這些數字之間的相對大小 比如說某個數字是這些數字中的第幾小,而與這個數字本身大小沒有關係,要的是相對大小 6 8 9 4 離散化後即為2 3 4 1 要理解相對大小的意思 6在這4...