動態規劃訓練之六

2022-01-29 09:17:01 字數 1492 閱讀 6210

這是一道好題

題目描述

求1-n排列組成的波動數列的個數

分析首先肯定是個dp沒錯了,考慮設計方案,

dp[i,j],表示用1-i的排列最後乙個為j的方案數

dp[i,j]相當於dp[i-1,k]中原排列大於等於j的數都加1,再把j插到末尾後的新合法排列的方案數

類似test10.7的排列題

答案有「m"型與"w"型,顯然方案數是一樣的,這裡只考慮"w"型的,最後把答案*2就行了

這時你可能會有疑問,為什麼偶數是列舉[1,j-1],而奇數是列舉[j,i-1],

因為只考慮「w」形態的,所以奇數一定是山峰的,而偶數一定山谷

所以奇數列舉的一定要比前乙個位置上的數大,偶數列舉的一定要比前乙個位置上的數小

#include#include#includeusing namespace std;

#define n 4211

#define m(a) ((a)<=mod?(a):(a-mod))

inline int read()

while(c>='0'&&c<='9')

return x*f;

}int n,mod;

int dp[n][n],ans=0;

int main()

for(int i=2;i<=n;i++)

while(c>='0'&&c<='9')

return x*f;

}int n,mod;

int dp[n][n],ans=0;

int b[n];

int lowbit(int x)

void add(int x,int d)

}int ask(int x)

return ans;

}int main()

for(int i=2;i<=n;i++)

}else

}memset(b,0,sizeof(b));

for(int j=1;j<=n;j++)

}for(int i=1;i<=n;i++)

cout<<2*ans%mod<

return 0;

}

動態規劃訓練之十九

題目大意 o n 求出乙個序列的本質不同的子串行個數 考慮動態規劃 dp i 表示前i位子序列的個數 很顯然如果沒有本質不同的話,子串行個數等同於子集的個數就是2n 1 但關鍵就在於這個本質不同?怎麼辦?當然考慮容斥 記vis a i 表示上一次a i 出現的位置 只要dp的時候減掉dp vis a...

動態規劃訓練之十七

題目描述 求所有 0,0 走到 n,m 路線 k 矩形個數 分析 考慮如果只是求方案數的話 很簡單乙個遞推dp i,j dp i 1,j dp i,j 1 也是乙個組合數c n m,n 再考慮把面積加上進行遞推 重新定義dp i,j 走到 i,j 之前所有方案的k矩形個數和 如果我們考慮每次豎著看一...

動態規劃訓練之十七

今天的考試題目中有單調佇列優化dp的,感覺不太熟練,所以練幾手題 其實這題就是今天的t2!首先是dp很明確 dp i,0 表示處理了前i個位置,並且第i個位置不選的最大值 dp i,1 表示處理了前i個位置,並且第i個位置要選的最大值 明顯dp i,0 max dp i 1,0 dp i 1,1 d...