思路:想明白了發現真的簡單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...