//知識點:dp
dp[a][b]表示前a+b個中有a個a,b個b那麼我們要找的結果就是dp[n+m][n+m]
先找邊界條件,注意最後要配成n個ab和m個ba,那麼就說明不能有n個以上的a或者m個以上的b在前
以第乙個樣例為例 1個ab,2個ba,有三個a和三個b 當出現兩個a在前: aa____ 或者三個b在前: bbb___ 這時的情況不滿足dp[a][b]=0;
總結一下就是前面有n個單獨的a或者m個單獨的b 單獨的表示沒有被使用(被搭配)
接下來就是找遞推方程
就是找下一位是a或者是b: dp[a][b]=dp[a-1][b]+dp[a][b-1] 注意這個加法要取餘數
#include
using namespace std;
const
int mod=
1e9+7;
const
int maxn=
1e3+5;
long
long dp[maxn+maxn]
[maxn+maxn]
;long
long
plus
(long
long a,
long
long b)
//相加取餘數
intmain()
for(
int b=m+
1;b<=n+m;b++
)//超過m個都不成立
for(
int a=
1;a<=n;a++
)//對a討論,先分配n個ab中的a
for(
int b=m+a+
1;b<=m+n;b++
)//搭配完後單獨的b超過m個不成立
}for
(int a=n+
1;a<=n+m;a++
)//n個ab中開頭的a分配完
for(
int b=a-n;b<=m+n;b++)}
cout<[n+m]
<}}
牛客暑期多校訓練營B Boundary
給定n個點,然後確定乙個過原點的圓,要使這n個點盡可能多的存在與圓上,最後輸出最多的存在於圓上的點的個數 三點確定乙個圓,我們已知這個圓必定經過原點,所以再依次利用三點求圓心的公式列舉每兩個點與原點 三點不共線 確定的圓心,最後選擇確定次數最多的圓心構成的圓 include include incl...
2019牛客暑期多校訓練營(第一場)
題意 題解 c 版本一 題意 題解 c 版本一 題意 題解 c 版本一 題意 題解 c 版本一 題意 題解 c 版本一 題意 題解 數學 計算幾何 邏輯推理 c 版本一 題解 特例 正三角形 取重心 中點 頂點,則期望為 公式 author stzg language c include inclu...
2019牛客暑期多校訓練營(第九場)
d knapsack cryptosystem 折半搜尋,晚上又去看了挑戰程式設計,對於時間複雜度高的情況,可以通過犧牲空間來降低時間複雜度。先把前半部分所有可以組合的情況列舉出來,然後對於後半部分依次列舉,那麼複雜度變化為o 2 36 o 2 18 2 18log 18 顯然就可做了,折半的裸題。...