牛客練習賽35 B 簡單dp,ORZ

2021-09-05 18:17:45 字數 1190 閱讀 8410

思路:想明白了發現真的簡單dp。。。我還是太菜了

**如下:

/*

果不其然。簡單dp...是我菜,不是題目難

做這題首先我沒想到dp(哭暈)

看了題解半天。一臉懵逼

既然dp解那麼先考慮最優解的結構特徵

先想只用一維表示,dp[i]:在i這個位置上得到的最多的方案數

上面是不行的,因為dp[i]沒有記錄i位置上是什麼元素,導致下一步無法轉移(條件中說了,不能有超過連續a個母音,只用dp[i]中的資訊無法知道,下一位能取什麼);

既然一維不行,在動態規劃的思考過程中,解決的方案應該是提高維數,從在狀態中獲得更多的資訊

觀察一維失敗的原因,是不知道上一位放的是什麼,所以給每個狀態多兩個位置存是取什麼值

dp[i][0,1]:0代表這個位上是母音;1是子音

(大佬們用這麼多就夠了。。。但是我想不通,所以小弟再加一維)

dp[i][0,1][j]:j代表算上i位有連續多少個相同元素

這樣子問題就能描述清楚了

*/#include#include#include#include#include#includeusing namespace std;

#define maxn 5009

#define inf 40000000

typedef pairp;

const long long mo=1e9+7;

long long dp[maxn][2][100];

int n,a,b;

int main()

dp[i][0][1]=(dp[i][0][1]*5%mo);

ans+=dp[i][0][1];

//i位=0,有k(k>=2)個0;

for(int k=2;k<=min(a,i);k++)

//i位=1,有1個1;(即前面全是0)

for(int k=1;k<=min(a,i-1);k++)

dp[i][1][1]=(dp[i][1][1]*21%mo);

ans+=dp[i][1][1];

//i位=1,有k(k>=2)個1;

for(int k=2;k<=min(b,i);k++)

ans%=mo;

} printf("%lld\n",ans); }

return 0;

}

牛客練習賽35B 背單詞 O n 轉移

傳送門 定義f i j 0 1 f i j 0 1 f i j 0 1 表示長度i ii且目前連續j jj個了,當前連續的是母音 子音 這樣就是傻瓜式轉移,轉移的時候注意一下不要陣列越界 我因為這個調了一小時 其實這麼轉移是非常浪費的 這麼轉移複雜度o n m o nm o nm 其中m mm表示限...

牛客練習賽4 B

思維題,把 i2 j2 ai2 aj2 絕對值符號去掉後,我們設i2 j2 ai2 aj2 j2 i2 aj2 ai2 j2 aj2 i2 ai2 或者 i2 j2 ai2 aj2 j2 i2 aj2 ai2 ai2 i2 aj2 j2 原式化簡後只有這兩種形式,那麼我們可以設定兩個陣列a n b ...

牛客練習賽69 B

題意 給定n nn個數,乙個x xx表示可以劃分成最多x xx個串,乙個y yy表示在乙個串中最多選擇y yy個數。最後求 i 1x j 1yv al i j sum x sum yval i,j i 1x j 1 y va l i,j v al i,j val i,j val i,j 為 將n n...