HDU 5903 - Square Distance [ DP ] ( BestCoder Round #87 1002 )
题意:
给一个字符串t ,求与这个序列刚好有m个位置字符不同的由两个相同的串拼接起来的字符串 s,
要求字典序最小的答案
分析:
把字符串折半,分成0 - n/2-1 和 n/2 - n-1
dp[i][j] 表示 第i位及之后的总代价为j可不可行
从第 n/2-1 位推回第 0 位, 若dp[0][m] = 1,则存在
然后贪心对每一位从'a'试到'z',选取接下来存在解的字符
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = ;
bool dp[MAXN][MAXN];//dp[i][j] :第i位及之后的总代价为j可不可行
int t, n, m;
char s[MAXN];
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
scanf("%s", s);
memset(dp, , sizeof(dp));
dp[n/][] = ;
for (int i = n/-; i >= ; i--)
{
if (s[i] == s[i+n/])
{
for (int j = ; j <= m; j++) dp[i][j] = dp[i+][j];//不改
for (int j = ; j <= m-; j++) if (dp[i+][j]) dp[i][j+] = ;//改两个
}
else
{
for (int j = ; j <= m-; j++) if (dp[i+][j]) dp[i][j+] = ;//改一个
for (int j = ; j <= m-; j++) if (dp[i+][j]) dp[i][j+] = ;//改两个
}
}
if (!dp[][m])
{
puts("Impossible"); continue;
}
int k = m;
for (int i = ; i < n/; i++)
{
for (int j = ; j < ; j++)
{
int p = ;
if (s[i] != j+'a') p++;
if (s[i+n/] != j+'a') p++;
if (dp[i+][k-p])
{
s[i] = j + 'a';
s[i+n/] = j + 'a';
k -= p;
break;
}
}
}
puts(s);
}
}
HDU 5903 - Square Distance [ DP ] ( BestCoder Round #87 1002 )的更多相关文章
- hdu 5903 Square Distance(dp)
Problem Description A string is called a square string if it can be obtained by concatenating two co ...
- BestCoder Round #87 1002 Square Distance[DP 打印方案]
Square Distance Accepts: 73 Submissions: 598 Time Limit: 4000/2000 MS (Java/Others) Memory Limit ...
- HDU 5903 Square Distance (贪心+DP)
题意:一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", ...
- HDU 5903 Square Distance
$dp$预处理,贪心. 因为$t$串前半部分和后半部分是一样的,所以只要构造前一半就可以了. 因为要求字典序最小,所以肯定是从第一位开始贪心选择,$a,b,c,d,...z$,一个一个尝试过去,如果发 ...
- HDU 5904 - LCIS (BestCoder Round #87)
HDU 5904 - LCIS [ DP ] BestCoder Round #87 题意: 给定两个序列,求它们的最长公共递增子序列的长度, 并且这个子序列的值是连续的 分析: 状态转移方程式 ...
- 暴力+降复杂度 BestCoder Round #39 1002 Mutiple
题目传送门 /* 设一个b[]来保存每一个a[]的质因数的id,从后往前每一次更新质因数的id, 若没有,默认加0,nlogn复杂度: 我用暴力竟然水过去了:) */ #include <cst ...
- 矩阵快速幂---BestCoder Round#8 1002
当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算.我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n) f(n-1)] = [f(n ...
- 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II
题目传送门 /* 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 当然有可能两个数和超过p,那么an的值最优,每 ...
- Manacher BestCoder Round #49 ($) 1002 Three Palindromes
题目传送门 /* Manacher:该算法能求最长回文串,思路时依据回文半径p数组找到第一个和第三个会文串,然后暴力枚举判断是否存在中间的回文串 另外,在原字符串没啥用时可以直接覆盖,省去一个数组空间 ...
随机推荐
- 线段树hdu1754
#include<iostream>#include<stdio.h>using namespace std;const int maxa=200005;int val[max ...
- ie6下:png图片不透明 和 背景图片为png的节点的内部标签单击事件不响应
1.png图片不透明 少量图片时:使用滤镜: _background:none; _filter:prodig:DXImageTransform.Microsoft.AlphaImageLoader( ...
- [Flask Security]当不能通过认证的时候制定跳转
Flask Security这个插件能对用户权限进行很好的控制. 通过三个model实现: User,存放用户数据 Role,存放角色数据 User_Role.存放用户角色信息 user_datast ...
- android技术下载
http://www.linuxidc.com/Linux/2011-08/41339.htm http://linux.linuxidc.com/2011%E5%B9%B4%E8%B5%84%E6% ...
- PCB布线的地线干扰与抑制方法
1.地线的定义什么是地线?大家在教科书上学的地线定义是:地线是作为电路电位基准点的等电位体.这个定义是不符合实际情况的.实际地线上的电位并不是恒定的.如果用仪表测量一下地线上各点之间的电位,会发现地线 ...
- PSAM读卡芯片TDA8007BHL开发
WWT:Work Waiting Time ATR:Answer To Reset,复位应答 etu =F/Df 1. PSAM概述和应用 PSAM(PurchaseSecure Access ...
- windows bat命令编写大全
1 echo 和 @ @ #关闭单行回显echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显.一般批处理第一行都是这个 echo on #从下一行开始打开回显 ec ...
- Powershell创建数组
在Powershell中创建数组可以使用逗号. PS C:Powershell> $nums=2,0,1,2 PS C:Powershell> $nums 2 0 1 2 对于连续的数字数 ...
- 关于<ul><ol><li>的用法
<ul>:无序列表 <ol>:有序列表 <li>:行. 想要去掉前面的序号和点可以在<ol>或<ul>style中用list-style: ...
- Entify Framewrok - Join的使用方法
问题:有2个表,使用id相连,如何用Join语法将其连接起来? 如下代码 List<tblAssociation> assoList = dataContext.tblAssociatio ...