牛客编程巅峰赛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; } };
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮