1. 程式人生 > 實用技巧 >牛客程式設計巔峰賽S1第5場 - 黃金&鑽石&王者 B.牛牛的字串 (DP)

牛客程式設計巔峰賽S1第5場 - 黃金&鑽石&王者 B.牛牛的字串 (DP)

  • 題意:有一個字串\(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;
        }
    };