返回顶部

牛客编程巅峰赛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;
        }
    };
    
posted @ 2020-07-24 12:56  _Kolibri  阅读(203)  评论(0)    收藏  举报