牛客程式設計巔峰賽S1第5場 - 黃金&鑽石&王者 B.牛牛的字串 (DP)
阿新 • • 發佈:2020-07-24
-
題意:有一個字串\(s\),我們可以選擇\(s_{i}\),如果\(s_{i+k}>s_{i}\),那麼就可以交換\(s_{i}\)和\(s_{i+k}\),問最多能夠交換多少次.
-
題解:因為限定了\(k\),所以我們交換的位置是固定的,即所有能交換的位置的\(i\)%\(k\)都相等,那麼對於某個位置\(i\),在它之前的\(i\)%\(k\)相等的位置的字元,只要比\(s_{i}\)小,我們就都能進行交換,那麼很明顯,我們可以用dp來處理,\(dp[i][j]\),\(i\)表示固定的位置(i%k),\(j\)表示固定位置字元的個數.
-
程式碼:
class Solution { public: /** * * @param s string字串 s.size() <= 1e5 * @param k int整型 k <= s.size() * @return int整型 */ int dp[100010][26]; int cnt=0; int turn(string s, int k) { for(int i=0;i<s.size();++i){ int now=s[i]-'a'; for(int j=0;j<now;++j){ cnt+=dp[i%k][j]; } dp[i%k][now]++; } return cnt; } };