日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

poj1769 线段树优化的dp

發(fā)布時(shí)間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj1769 线段树优化的dp 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  附上這道題的鏈接:http://poj.org/problem?id=1769

  題目的意思是有一個(gè)裝置可以輸出n個(gè)數(shù)的最大值, 這個(gè)裝置由m個(gè)排序器組成, 每個(gè)排序器可以將這n個(gè)數(shù)從s 到 t的數(shù)按照從小到大的順序排列, 有一個(gè)人發(fā)現(xiàn)將m個(gè)排序器中的一些排序器去掉仍然不影響功能, ?現(xiàn)在問(wèn)你最少需要多少個(gè)排序器可以完成功能。 我們可以定義dp[i][j]為前i個(gè)排序器將第1個(gè)數(shù)提到j(luò)所需要的最少的排序器的數(shù)量, 那么當(dāng)t[i] == j的時(shí)候 dp[i][j] = min(dp[i-1][j] , min(dp[i-1][si -- ti]) + 1) ?當(dāng)ti != j的時(shí)候 dp[i][j] = dp[i-1][j], ?我們觀察狀態(tài)數(shù)有m*n個(gè), 顯然直接求解會(huì)超時(shí), 因此我們考慮使用線段樹來(lái)優(yōu)化 ?見挑戰(zhàn)程序設(shè)計(jì) p207 , 代碼如下:

#include <cstdio> #include <cstring> #include <algorithm>using namespace std; const int maxn = 500000 + 100; const int inf = 0x3f3f3f3f; int n, m;struct segment{int l, r;int x; }seg[3*maxn];void build(int rt, int l, int r) {seg[rt].l = l; seg[rt].r = r;if(l == r) {int value = inf;if(l == 1) value = 0;seg[rt].x = value;return ;}int chl = 2*rt, chr = 2*rt + 1;int mid = (l + r) / 2;build(chl, l, mid);build(chr, mid+1, r);seg[rt].x = min(seg[chl].x, seg[chr].x); }int query(int rt, int l, int r) {if(seg[rt].l == l && seg[rt].r == r) {return seg[rt].x;}int mid = (seg[rt].l + seg[rt].r)/2;if(r <= mid)return query(2*rt, l, r);else if(l > mid)return query(2*rt+1, l, r);else{int v1 = query(2*rt, l, mid);int v2 = query(2*rt+1, mid+1, r);return min(v1, v2);} }void update(int rt, int i, int c) {if(seg[rt].l==seg[rt].r && seg[rt].l == i) {seg[rt].x = c;return ;}int mid = (seg[rt].l + seg[rt].r)/2;if(i <= mid)update(2*rt, i, c);elseupdate(2*rt+1, i, c);seg[rt].x = min(seg[2*rt].x, seg[2*rt+1].x); }int main() {while(scanf("%d%d", &n, &m) != EOF) {build(1, 1, n);for(int i=0; i<m; i++) {int s, t;scanf("%d%d", &s, &t);int v1 = query(1, s, t) + 1;int v2 = query(1, t, t);int v3 = min(v1, v2);update(1, t, v3);}printf("%d\n", query(1, n, n));}return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/xingxing1024/p/5487428.html

總結(jié)

以上是生活随笔為你收集整理的poj1769 线段树优化的dp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。