方伯伯的商場之旅(數字DP)

2021-10-24 16:21:50 字數 1904 閱讀 4138

description

方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。

現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數l,r。方伯伯要把位置在 [l,r]中的每個人的石子都合併成一堆石子。每次操作,他可以選擇乙個人面前的兩堆石子,將其中的一堆中的某些石子移動到另一堆,代價是移動的石子數量 * 移動的距離。商場承諾,方伯伯只要完成任務,就給他一些椰子,代價越小,給他的椰子越多。所以方伯伯很著急,想請你告訴他最少的代價是多少。

例如:10 進製下的位置在 12312 的人,合併石子的最少代價為:

1∗2+2∗1+3∗0+1∗1+2∗2=9

即把所有的石子都合併在第三堆.

input

輸入僅有 1 行,包含 3 個用空格分隔的整數 l,r,k,表示商場給方伯伯的 2 個整數,以及進製數.

output

輸出僅有 1 行,包含 1 個整數,表示最少的代價.

sample input

3 8 3

sample output

5hint

1<=l<=r<=1015,2<=k<=20

**://頭部分 已刪去

typedef

long

long ll;

using

namespace std;

const

int32_t maxn =

1e5+5;

int num[61]

;int k;

int maxbit =60;

ll dp1[61]

[1400];

ll dfs1

(int pos,

bool limit,

int cost,

int bas)if(

!limit &&

~dp1[pos]

[cost]

)return dp1[pos]

[cost]

; ll res =0;

int up = limit ? num[pos]

: k -1;

for(

int i =

0; i <= up; i++)if

(!limit)dp1[pos]

[cost]

= res;

return res;

}ll solve1

(ll x)

return

dfs1

(maxbit,

true,0

,0);

}ll dp[61]

[200];

ll dfs

(int pos,

bool limit,

int pre,

int suf,

int nowp)

// nowp -> nowp-1if(

!limit)dp[pos]

[delta +

100]

= res;

return res;

}ll solve

(ll x,

int pp)

return

dfs(maxbit,

true,0

,0, pp);}

signed

main()

ll ans =

solve1

(r)-

solve1

(l -1)

;for

(int i = maxbit; i >

1; i--

)println

(ans)

;return0;

}

方伯伯的商場之旅 SCOI2014

方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r 方伯伯要把位置在 l,r 中的每個人的石子都合併成一堆石...

SCOI2014 方伯伯的商場之旅

方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r。方伯伯要把位置在 l,r 中的每個人的石子都合併成一堆石...

SCOI2014 方伯伯的商場之旅

題目描述 方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r 方伯伯要把位置在 l,r 中的每個人的石子都合...