tc-551-div2

来源:互联网 发布:k30平板荷载试验算法 编辑:程序博客网 时间:2024/05/22 07:28


A题

给一个字符串,要求重新排列使得满足“相邻两个颜色不同”这个条件的只有一个,问排列次数。

分情况:

1. 如果只有一种颜色,那么为1;

2.如果有两种颜色,要么A……AB……B,要么反过来,为2

3.如果有三种颜色,是不可能的,为0;


在数字符串中有多少不同的字符的过程中,可以采用“排序+删除相邻相同元素”的方法":

#include <cstdio>#include <string>#include <algorithm>#include <iostream>using namespace std;int main(){    string a = "abcda";    sort(a.begin(), a.end());    a.erase(unique(a.begin(), a.end()), a.end());    cout << a << endl;    return 0;}



B.题

给一个字符串和一个数字k,允许两个相邻的字符进行交换为1次操作,问最多k次操作后,连续最长的元素的长度。

1. 判断连续最长的元素的长度的元素种类不可能,因此只能采取枚举的方法。

2.如果是第k个元素,那么求得以元素k为中心可以聚集多少元素,取最大值即为所求。

复杂度:

O(50 * 50)


C题:

如果采用组合数学的方法很难求得公式。

如果采用dfs的方法,复杂度是2^50太大了。

考虑到有许多情况是相同的,比如说abc***和bac***后面的情况是相同的,每种情况所需要的参数是a,b,c,last;(a表示剩下a可用的个数,b表示剩下的b可用的个数,c表示剩下的c可用的个数)所以总共的dp情况有50 * 50 * 50 * 3种,可以很好解决。

引用的一个小技巧:

long long &res = dp[a][b][c][last];

如此便可直接使用dp[a][b][c][last];




原创粉丝点击