hdu_5903_Square Distance(dp)

题目链接:hdu_5903_Square Distance

题意:

给你一个长度为n的a串,一个数m,现在让你构造一个长度也为n的b串,使这个串是由两个相同的串拼起来的,并且和a串对应的位不同的数量为m

题解:

1.可以知道构造的串前面和后面都是相同的,所以只需要构造前半段就行了,当然你可以分类讨论,然后构造

2.设dp[i][j]表示考虑到第i个字符已经有j个与a串对应位不同,然后状态转移方程看代码,注意的是这里要倒着转移回去

因为要满足最小的字典序,并且对应不同的位数为m,倒着转移构造m,最后正着改变字符

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;i++)
 3 using namespace std;
 4
 5 const int N=1007;
 6 int t,n,m;
 7 bool dp[N][N];
 8 char s[N];
 9
10 void O_O()
11 {
12     int haf=n/2;
13     F(i,0,haf+1)F(j,0,m)dp[i][j]=0;
14     dp[haf+1][0]=1;
15     for(int i=haf;i>=1;i--)if(s[i]==s[haf+i])
16     {
17         F(j,0,m)dp[i][j]|=dp[i+1][j];//不改
18         F(j,2,m)dp[i][j]|=dp[i+1][j-2];//改两个
19     }else
20     {
21         F(j,1,m)dp[i][j]|=dp[i+1][j-1];//改一个
22         F(j,2,m)dp[i][j]|=dp[i+1][j-2];//改两个
23     }
24     if(!dp[1][m]){puts("Impossible");return;}
25     F(i,1,haf)F(j,0,25)
26     {
27         int now=(s[i]!=j+‘a‘)+(s[i+haf]!=j+‘a‘);
28         if(dp[i+1][m-now])
29         {
30             s[i+haf]=s[i]=j+‘a‘,m-=now;
31             break;
32         }
33     }
34     puts(s+1);
35 }
36
37 int main()
38 {
39     scanf("%d",&t);
40     while(t--)scanf("%d%d%s",&n,&m,s+1),O_O();
41     return 0;
42 }

时间: 2024-10-06 14:29:59

hdu_5903_Square Distance(dp)的相关文章

hdu 5903 Square Distance(dp)

Problem Description A string is called a square string if it can be obtained by concatenating two copies of the same string. For example, "abab", "aa" are square strings, while "aaa", "abba" are not. Hamming distanc

BestCoder Round #87 1002 Square Distance[DP 打印方案]

Square Distance Accepts: 73 Submissions: 598 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", "abba"不是. 两个长度相同字

HDU 5903 - Square Distance [ DP ] ( BestCoder Round #87 1002 )

题意: 给一个字符串t ,求与这个序列刚好有m个位置字符不同的由两个相同的串拼接起来的字符串 s, 要求字典序最小的答案    分析: dp[i][j] 表示 第i位及之后的总代价为j可不可行 从第 n/2-1 位推回第 0 位, 若dp[0][m] = 1,则存在 然后贪心对每一位从'a'试到'z',选取接下来存在解的字符 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #inclu

[HDU5903]Square Distance(DP)

题意:给一个字符串t ,求与这个序列刚好有m个位置字符不同的由两个相同的串拼接起来的字符串 s,要求字典序最小的答案. 分析:按照贪心的想法,肯定在前面让字母尽量小,尽可能的填a,但问题是不知道前面填了那么多a之后后面能否填完(因为对于那些s[i]!=s[i+n/2]的位置,必定会有一次花费) 于是就想到用dp[i][j]表示i~n这段位置,花费j是否合法 贴上转移: 1 dp[n/2][0]=1; 2 for(int i=n/2-1;i>=0;--i) 3 if(s[i]==s[i+n/2])

583. Delete Operation for Two Strings

Problem statement: Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string. Example 1: Input: "sea", "eat" Output: 2

[CF161D]Distance in Tree-树状dp

Problem Distance in tree 题目大意 给出一棵树,求这棵树上有多少个最短距离为k的点对. Solution 这个题目可以用点分治来做,然而我到现在还是没有学会点分治,所以只好用树形dp了. 这个题目,我们可以将其转化为一个个子树中搞事情,再慢慢合并. 设f[i][j]为以i为根的子树中距离根距离为j的点有多少个. 对于一个点u,我们枚举它的子节点v,则我们可以计算出经过u-v这条边的答案 我们枚举j=1->k,则ans+=f[u][j]*f[v][k-j-1]; 枚举完以后

codeforces161D - Distance in Tree 树形dp

题意:给你一棵树,问你树中距离为k的有多少种情况. 解题思路:树形dp  维护每个节点(1-K)深度的情况, 解题代码: 1 // File Name: 161d.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月03日 星期日 19时20分10秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #incl

codeforces 161D - Distance in Tree(树形dp)

题目大意: 求出树上距离为k的点对有多少个. 思路分析: dp[i][j] 表示 i 的子树中和 i 的距离为 j 的点数有多少个.注意dp[i] [0] 永远是1的. 然后在处理完一颗子树后,就把自身的dp 更新. 更新之前更新答案. 如果这颗子树到 i 有 x 个距离为j的.那么答案就要加上 dp[i] [ k-j-1] * x; #include <iostream> #include <cstdio> #include <cstring> #include &l

HDU 5903 Square Distance (贪心+DP)

题意:一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", "abba"不是. 两个长度相同字符串之间的 hamming distance是对应位置上字符不同的位数. 给定一行字符串和 m,输出字典序最小的字符串. 析:首先先用dp判断能不能形成这样的字符串,然后再打印出来,dp[i][j] 表示 i - 中间的数能不能改 j 个字符得到,最后打印