題意:有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...