毕业设计开发网站要怎么做,百度爱采购怎样入驻,攻击wordpress,企业服务行业题意#xff1a;给定一个长为s的字符串#xff08;其中s为k的倍数#xff09;#xff0c;然后按照前后分成s/k 组#xff0c;每组之内可以重排#xff0c;使得重排后的块数最少#xff08;一段连续的字母算是一块#xff09;。 思路#xff1a;区间dp#xff0c;dp[i…题意给定一个长为s的字符串其中s为k的倍数然后按照前后分成s/k 组每组之内可以重排使得重排后的块数最少一段连续的字母算是一块。 思路区间dpdp[i][fa]表示前i组且第i1组的最左边的字符是faa的状态能得到的最少的块数,那么状态转移也就是枚举两边应该放什么字符。 code #include bits/stdc.h
using namespace std;const int N1005;
vectorintg[N];
int n,k,dp[N][26];
char s[N];int dfs(int i,int j)
{if (dp[i][j]0) return dp[i][j];if (i0) return 0;vectorint vg[i];int ansINT_MAX;for (int k0;kv.size();k){int cntv.size();if (v[k]j) cnt--;for (int p0;pv.size();p)ansmin(ans,dfs(i-1,v[p])cnt(pkv.size()1?1:0));}return dp[i][j]ans;
}int main()
{int T;scanf(%d,T);while (T--){scanf(%d%s,k,s);n0;for (int i0;s[i]!\0;ik){char s1[N];for (int ji;jik;j) s1[j-i]s[j];s1[k]\0;sort(s1,s1k);g[n].clear();for (int j0;jk;j)if (s1[j]!s1[j1])g[n].push_back(s1[j]-a);}memset(dp,-1,sizeof(dp));printf(%d\n,dfs(n,26));}
}