poj 1141(區間dp 滾動陣列)

2021-07-29 23:33:26 字數 1064 閱讀 7922

題意:有m個人,我們任選3個人組成乙個隊伍,可以組成c(m,3)種隊伍,給出這些隊伍之間的勝率。現在,需要你戰勝n個隊伍。戰勝該隊伍,你可選擇用戰勝的隊伍來替換你現有的隊伍。現在要求戰勝這n個隊伍的最大概率。

思路:因為對於戰勝的隊伍,我們可以選擇替換還是不替換,這就像01揹包。因為n非常大,我們需要考慮o(n)的遞推方程。

如果我們從前向後遞推,會存在乙個後效性的問題,就是,當前的最優解可能不是全域性的最優解。這就暗示了我們需要從後往前遞推。

如何從後向前遞推呢?因為最後乙個被戰勝的隊伍是確定的,那每個隊戰勝該隊的概率就是確定的。而對於其他的隊,我們有兩種方式來戰勝它,保持原來的隊伍不變,用前乙個隊來替換自己的隊伍來戰勝它。而到底用哪乙個就是取決與其中的最大值。

因為有前後關係,我們要利用滾動陣列。

自己的分析:因為前面不知道換不換隊伍,如果更改隊伍,那麼判斷條件是用以前上面的作為判定依據,而改了以後,相當於把以前上面的都改了,無法繼續為下面做判斷。但是下面的所有情況都是確定的,當前是可以根據以前的較大值而確定。

、、、簡單說,就是如果從前往後,你不知道換了以後的情況,但是從後往前,你可以知道換了以後是怎麼樣的,可以做比較。

#include 

#include

#include

#include

using

namespace

std;

double dp[1010][1010];

int ai[10100];

double p[1010][1010];

int main()

}int m;

scanf("%d",&m);

for(int i=1;i<=m;i++)

scanf("%d",&ai[i]);

for(int i=0;i1][i]=p[i][ai[m]];

}for(int i=m-1;i>=1;i--)

}double ans=0;

for(int i=0;i1][i]);

}printf("%.6lf\n",ans );

}}

poj 1141 區間dp 列印路徑

題意 定義合法的括號序列如下 1 空序列是乙個合法的序列 2 如果s是合法的序列,則 s 和 s 也是合法的序列 3 如果a和b是合法的序列,則ab也是合法的序列 例如 下面的都是合法的括號序列 下面的都是非法的括號序列 給定乙個由 和 組成的序列,找出以該序列為子串行的最短合法序列。解題思路 這題...

POJ 1141 括號區間DP

1.題目鏈結。其實這個題目就是一般的區間dp,不過感覺輸出還是需要一點技巧的。2.dp i j 表示區間 i,j 需要加的括號的最小的數量,那就分為兩種情況討論,s i 與s j 匹配的時候,s i 與s j 不匹配的時候。匹配的時候直接就是有dp i 1 j 1 轉移而來,不匹配的時候,列舉中間點...

poj1141(括號匹配 區間dp)

題意 給乙個括號序列,問包含此序列的最短合法括號序列 解法 普通的區間dp,num i j 記錄的是i j子串行最少需要補充的括號個數,只是在要記錄區間的最優分界點rem i j 從而將最短合法括號序列輸出,複雜度o n 3 include include include using namespa...