無後效性問題

2021-10-10 18:40:42 字數 3269 閱讀 1766

【題目】給定陣列arr,所有元素都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法。

【舉例】

arr=[5,10,25,1] aim=0

返回1。組成0元的方法有一種,即所有貨幣都不用

arr=[3,5] aim=2

返回0。無法組成2.

arr=[5,10,25,1] aim=15

返回6。35,5+10,101+5,151,25+51,10+51

public

static

void

main

(string[

] args),15

));//6

system.out.

println

(coins1

(new

int,

2));

//0 system.out.

println

(coins2

(new

int,

15));

//6 system.out.

println

(coins2

(new

int,

2));

//0}

//方法一:暴力遞迴

public

static

intcoins1

(int

arr,

int aim)

return

process1

(arr,

0,aim);}

//arr:面值陣列,index:可以任意自由使用index及其之後所有的棧,aim:目標錢數,返回值:方法數

private

static

intprocess1

(int

arr,

int index,

int aim)

else

}return res;

}//方法二:利用map記憶化搜尋,防止重複計算

public

static

intcoins2

(int

arr,

int aim)

return

process2

(arr,

0,aim);}

//key:"index_aim",value:返回值

public

static hashmap

map =

newhashmap

<

>()

;private

static

intprocess2

(int

arr,

int index,

int aim)

else

else}}

map.

put(string.

valueof

(index)

+"_"

+string.

valueof

(aim)

,res)

;return res;

}//方法三:動態規劃

public

static

intcoins3

(int

arr,

int aim)

int[

] dp=

newint

[arr.length]

[aim+1]

;//dp[i][j]表示使用arr[0...i]組成j的方法數

for(

int i=

0;i)for

(int j=

0;arr[0]

*j<=aim;j++

)//求一般位置的dp[i][j],由兩者疊加

for(

int i=

1;ireturn dp[arr.length-1]

[aim]

;//arr[0...n]組成aim的方法數

}

【題目】給定乙個整型陣列arr,代表數值不同的紙牌排成一條線。玩家a和玩家b依次拿走每張紙牌,規定玩家a先拿,玩家b後拿,但是每個玩家每次只能拿走最左或最右的紙牌,玩家a和玩家b都絕頂聰明。請返回最後獲勝者的分數。

【舉例】

arr=[1,2,100,4]。

開始時玩家a只能拿走1或4。如果玩家a拿走1,則排列變為[2,100,4],接下來玩家b可以拿走2或4,然後繼續輪到玩家a。如果開始時玩家a拿走4,則排列變為[1,2,100],接下來玩家b可以拿走1或100,然後繼續輪到玩家a。玩家a作為絕頂聰明的人不會先拿4,因為拿了4之後玩家b將拿走100。所以玩家a會先拿1,讓排列變為[2,100,4],接下來玩家b不管怎麼選,100都會被玩家a拿走。玩家a會獲勝,分數為101。所以返回101。

arr=[1,100,2]。

開始時玩家a不管拿1還是2,玩家b作為絕頂聰明的人,都會把100拿走。玩家b會獲勝,分數為100。所以返回100。

public

class

cardsinline

return math.

max(

f(arr,

0, arr.length -1)

,s(arr,

0, arr.length -1)

);}public

static

intf

(int

arr,

int i,

int j)

return math.

max(arr[i]+s

(arr, i +

1, j)

, arr[j]+s

(arr, i, j -1)

);}public

static

ints

(int

arr,

int i,

int j)

return math.

min(

f(arr, i +

1, j),f

(arr, i, j -1)

);}public

static

void

main

(string[

] args)

; system.out.

println

(win1

(arr));

}}

什麼是無後效性?

某階段的狀態一旦確定,則此後過程的演變不再受此前各種狀態及決策的影響 現在有乙個四乘四的網格,左上角有乙個棋子,棋子每次只能往下走或者往右走,現在要讓棋子走到右下角 假設棋子走到了第二行第三列,記為s 2,3 如下圖,畫了兩條路線和一條不符合題意的路線,那麼當前的棋子 s 2,3 位置 怎麼走到右下...

賄賂FIPA 階段內轉移無後效

fipa 國際國際計畫協會聯合會 近期將進行投票,以確定下一屆ipwc 國際規劃世界盃 的主辦方。鑽石大陸的代表本內特希望通過以贈送鑽石買通國家的方式,獲得更多的投票。當然,他並不需要買通所有的國家,因為小國家會跟隨著他們附庸的大國進行投票。換句話說,只要買通了乙個大國,就等於獲得了它和它統治下所有...

動態規劃最優化原理與無後效性

上面已經介紹了動態規劃模型的基本組成,現在需要解決的問題是 什麼樣的 多階段決策問題 才可以採用動態規劃的方法求解?一般來說,能夠採用動態規劃方法求解的問題必須滿足.最優化原理和.無後效性原則。1 動態規劃的最優化原理。作為整個過程的最優策略具有如下性質 無論過去的狀態和決策如何,對前面的決策所形成...