USACO3 1 6 郵票 動態規劃 滾動陣列

2021-06-28 19:51:08 字數 1687 閱讀 1259

bool型別:f[i][j]  i這個數額,由j個郵票貼成 是否可行。  f[i][j] =

換乙個思路

f[i]  i這個數額,最少由幾張郵票組成。

f[i] = min + 1    其中i的數額最高可以到達 pk也就是10000*200=2000000的空間和時間其實都是很大了。 再加上每次轉移是o(k),還是會tle。

但是這裡我只需要找一些數字,也就是只有用到f[i-p],而在f陣列更靠前的地方,其實是用不到那些空間了。那麼可以在這裡考慮到空間優化,優化到o(10000)的空

間。這就是無壓力可以接受的了。

接下來是轉移的問題。

假如有1,2,5 這幾個面額。 對於  10而言,可以從9,8,5轉移。從f[9] f[8] f[5]找乙個最小值。 接下來是從f[6] f[9] f[10]找最小值…… 貌似沒有什麼可以優化

的,雖然是找最小值,但是並不是區間上的最小值查詢,而且不具有連續性,所以貌似不好用堆或者線段樹來解決……

最終時間複雜度

2000000 * 50 = 10000000 = 10^8  應該不會tle。 但是這麼不優秀的演算法,我實在不開心啊……

compiling...

compile: ok

executing...

test 1: test ok [0.005 secs, 3416 kb]

test 2: test ok [0.003 secs, 3416 kb]

test 3: test ok [0.003 secs, 3416 kb]

test 4: test ok [0.003 secs, 3416 kb]

test 5: test ok [0.003 secs, 3416 kb]

test 6: test ok [0.000 secs, 3416 kb]

test 7: test ok [0.005 secs, 3416 kb]

test 8: test ok [0.005 secs, 3416 kb]

test 9: test ok [0.008 secs, 3416 kb]

test 10: test ok [0.057 secs, 3416 kb]

test 11: test ok [0.467 secs, 3416 kb]

test 12: test ok [0.100 secs, 3416 kb]

test 13: test ok [0.005 secs, 3416 kb]

all tests ok.

只用了3m的空間~~~ 這點倒是我很滿意的地方啦啦啦啦啦啦啦啦~~~~

/*

task:stamps

lang:c++

*/#include #define inf 10000

#define min(a, b) ((a)<(b)?(a):(b))

#define size 13000

int k, n;

int a[50];

int f[size]=, now=0, ans=0, tmp, minnum;

int main()

if (minnum >= k) break;

f[now] = minnum + 1;

} printf("%d\n", ans - 1);

return 0;

}

演算法 動態規劃 郵票問題

題目描述 已知乙個 n 枚郵票的面值集合 如,和乙個上限 k 表示信封上能夠貼 k 張郵票。計算從 1 到 m 的最大連續可貼出的郵資。例如,假設有 1 分和 3 分的郵票 你最多可以貼 5 張郵票。很容易貼出 1 到 5 分的郵資 用 1 分郵票貼就行了 接下來的郵資也不難 6 3 3 7 3 3...

usaco 3 4 rockers 動態規劃

f disk song ti 表示用前disk張光碟,錄製前song首歌曲 不一定錄製第song首歌曲 的最大曲目數,並且當前在錄的光碟剩餘時間是ti f disk song ti max f disk song 1 ti f disk 1 song 1 t a song disk 1 a song...

USACO動態規劃之揹包問題1

序言 dp太辣雞所以要刷題!做完usaco裡dp專題的所有題!然而還有數字dp插頭dp的都還不會qwq 題目 題解 一 subset sums,usaco 1998 spring 解題思路 因為平分,所以以和的一半當總容量做01揹包。答案除以2,因為會重複算一次 include include in...