UVA 11552 Fewest Flops

原创 2016年08月29日 23:36:02

题目链接:http://acm.hust.edu.cn/vjudge/problem/28550


题意:将字符串每k个字符分为一组(长度为k的倍数),每组内字符可以任意重排,使得重排之后的字符串包含尽量少的块,每个块为连续的相同字母。


思路:dp[i][j]表示前i个块,且第i个块以j字符结束时的最小块数。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007
const int maxn = 1009;

int T,k,n;
char s[maxn];
int kind[maxn]; //每个块内的字符种类
vector<int> p[maxn];  //块内字符
bool g[maxn][27]; //第i个块是否含有j
int dp[maxn][27];

void init()
{
    bool flag[30];
    int len = strlen(s+1);
    n = len / k;
    int pos = 0;
    Clean(g,false);
    rep(i,1,n)
    {
        kind[i] = 0;
        p[i].clear();
        p[i].push_back(0);
        Clean(flag,true);
        rep(j,1,k)
        {
            int x = s[++pos] - 'a' + 1;
            if ( flag[x] ) kind[i]++ , flag[x] = false , p[i].push_back(x);
            g[i][x] = true;
        }
    }
}

void solve()
{
    Clean(dp,0x3f);
    rep(i,1,kind[1])
        dp[1][i] = kind[1];

    rep(i,2,n)
    {
        rep(j,1,kind[i])
        rep(k,1,kind[i-1])
        {
            if ( ( g[i][p[i-1][k]] && p[i][j] != p[i-1][k] ) || ( kind[i] == 1 && p[i][j] == p[i-1][k] ) ) //有相同的字符,放在一起
                dp[i][j] = min( dp[i][j] , dp[i-1][k] + kind[i] - 1 );
            else
                dp[i][j] = min( dp[i][j] , dp[i-1][k] + kind[i] );
        }
    }
    int ans = inf;
    rep(i,1,kind[n])
        ans = min( ans , dp[n][i] );
    cout<<ans<<endl;
}

int main()
{
    cin>>T;
    while(T--)
    {
        scanf("%d %s",&k,s+1);
        init();
        solve();
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

有关FLOPS的定义与计算

FLOPS(即“每秒浮点运算次数”,“每秒峰值速度”),是“每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用来估算电脑的执行效能...
  • qq_28372387
  • qq_28372387
  • 2016年03月14日 22:28
  • 3220

uva 11552 最小的块数

动态规划状态方程 映射26个字母 a-z 为 0 -25 dp[i][j][k] 表示第i个分组以j字母组开头以k字母组结尾时候最小划分的块数 num = len / k; 遍历dp[num ...
  • cfzjxz
  • cfzjxz
  • 2013年03月18日 21:06
  • 586

[译]基于深度残差学习的图像识别

基于深度残差学习的图像识别
  • chenyanqiao2010
  • chenyanqiao2010
  • 2017年10月31日 21:59
  • 308

组原第一讲作业

1-5  冯诺依曼计算机的特点是什么?     1.计算机由运算器、存储器、控制器、输入设备和输出设备五大部件组成。     2.指令和数据以同等地位存放于存储器内,并可按地址寻访。     3.指令...
  • qq_31311639
  • qq_31311639
  • 2015年09月23日 21:47
  • 213

Yoshua Bengio等大神传授:26条深度学习经验

转载自:http://www.csdn.net/article/2015-09-16/2825716 8月初的蒙特利尔深度学习暑期班,由Yoshua Bengio、 Leon Bottou等大神...
  • memray
  • memray
  • 2015年09月23日 10:20
  • 3678

习题4-8 特别困的学生 UVa12108

#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #define N 1000000 int n...
  • u014800748
  • u014800748
  • 2014年08月06日 21:35
  • 1872

UVA-815 flooded!(白书说能锻炼思维的题)

题意挺长的,而且是英文的,我这里就简述一下吧,就是有m*n个格子,每个格子都是10*10的规格(高度是无限的),给出每个格子的海拔,然后给出一个洪水的量,输出最后水深度和完全被水覆盖的面积百分比。这个...
  • FishSeeker
  • FishSeeker
  • 2016年04月08日 09:36
  • 955

UVA 1658 - Admiral (拆点+最小费用流)

该题中的拆点法是解决几点容量的通用方法 。  因为只有容量限制的话仍然不能满足每个结点只访问一次这个限制 ,原因很简单,大家画个图就知道了,假设从起点有两条路到同一个结点2,然后又都到末点n,虽然它们...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2015年08月21日 20:53
  • 1094

uva 12174 - Shuffle(预处理+暴力)

题目链接:uva 12174 - Shuffle 题目大意:有一个播放器用于播放音乐,现在给出s(已有曲目的数量),n给出记录的长度。播放器有随机播放的功能,每次生成一个1~s的随机系列进行...
  • u011328934
  • u011328934
  • 2014年02月16日 19:05
  • 1497

Rails(UVa514)(栈)

Rails  There is a famous railway station in PopPush City. Country there is incredibly hilly. Th...
  • hdd871532887
  • hdd871532887
  • 2015年12月21日 07:13
  • 652
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 11552 Fewest Flops
举报原因:
原因补充:

(最多只允许输入30个字)