codeforces 191A A. Dynasty Puzzles(dp)

题目链接:

codeforces 191A


题目大意:

给出n个字符串,两个字符串如果前一个的尾与后一个的首相同,那么可以相连,最后得到的字符串要满足首尾相同,问最长的符合要求的字符串的长度是多少。


题目分析:

  • 定义状态dp[i][j]代表以i开头以j结尾的最长的字符串的长度,具体转移看代码,水题不解释。


AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#define MAX 500007

using namespace std;

int n;
char s[MAX][12];
int len[MAX];
int dp[30][30];

int main ( )
{
    while ( ~scanf ( "%d" , &n ))
    {
        for ( int i = 0 ; i < n ; i++ )
        {
            scanf ( "%s" , s[i] );
            len[i] = strlen ( s[i] );
        }
        memset ( dp , -1 , sizeof ( dp ));
        for ( int i = 0 ; i < n ; i++ )
        {
            int x = s[i][0]-‘a‘;
            int y = s[i][len[i]-1] -‘a‘;
            for ( int j = 0 ; j < 26 ; j++ )
                if ( dp[j][x] != -1 )
                    dp[j][y] = max ( dp[j][x]+len[i] , dp[j][y] );
             dp[x][y] = max ( dp[x][y] , len[i] );
        }
        int ans = 0;
        for ( int i = 0 ; i < 26; i++ )
            for ( int j = 0 ; j < 26 ; j++ )
                if ( i == j )
                    ans = max ( ans , dp[i][j] );
        printf ( "%d\n" , ans );
    }
}

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

时间: 2024-10-22 04:47:33

codeforces 191A A. Dynasty Puzzles(dp)的相关文章

CodeForces 191A

CodeForces 191A 考虑 dp dp[i][j] 表示 以i 为开头以 j 为结尾字符串能够满足条件的最大值. 因为要满足 a...b,c....d a == d && b == c 的条件.. 直接 for (int j = 1; j <= 26; j++) { if (dp[j][st]) dp[j][ed] = max(dp[j][ed], dp[j][st] + m); } dp[st][ed] = max(dp[st][ed], m); 枚举开头进行更新,或者枚

Codeforces 360C Levko and Strings dp

题目链接:点击打开链接 题意: 给定长度为n的字符串s,常数k 显然s的子串一共有 n(n-1)/2 个 要求找到一个长度为n的字符串t,使得t对应位置的k个子串字典序>s #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<set> using namespace std; #

CodeForces 30C Shooting Gallery 简单dp

题目链接:点击打开链接 给定n个气球 下面n行 x y t val 表示气球出现的坐标(x,y) 出现的时刻t,气球的价值val 枪每秒移动1个单位的距离 问: 射击的最大价值,开始时枪瞄准的位置任意. 思路: dp一下.. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set

Codeforces 459E Pashmak and Graph(dp+贪心)

题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边按照权值排序,每次将相同权值的边同时加入,维护每个点作为终止点的最大长度即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 3

codeforces 149D - Coloring Brackets (区间dp)

题目大意: 给出一组合法的括号. 括号要么不涂颜色,要么就涂上红色或者绿色. 匹配的括号只能有一个有颜色. 两个相邻的括号不能有相同的颜色. 思路分析: 因为是一个合法的括号序列. 所以每个括号与之匹配的位置是一定的. 那么就可以将这个序列分成两个区间. (L - match[L] )  (match[L]+1, R) 用递归先处理小区间,再转移大区间. 因为条件的限制,所以记录区间的同时,还要记录区间端点的颜色. 然后就是一个递归的过程. #include <cstdio> #include

CodeForces 55D Beautiful numbers 数位DP+数学

题意大概是,判断一个正整数区间内有多少个整数能被它自身的每一个非零的数字整除. 因为每一个位置上的整数集s = {0,1,2,3,4,5,6,7,8,9} lcm(s) = 2520 现在有一个整数t是由s中一个或者多个数字构成的,记为abcde,显然t = a*10^4+b*10^3+c*10^2+d*10^1+e 要使得t能被a,b,c,d,e整除,必然有t % lcm(a,b,c,d,e) = 0 因为a,b,c,d,e去重之后一定是s的一个子集,所以lcm(s)一定是lcm(a,b,c,

Codeforces 191A Dynasty Puzzles

题意:给你一连串字符串,问你下一个字符串尾字母等于前一个字符首字母,最后一个字符串尾字母等于首串首字母,这样的构造出的字符串最长为多少. 解题思路:dp[i][j] 表示以 i 字母开头  j 字母结尾 的最长字符串. 解题代码: 1 // File Name: 191a.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月10日 星期二 18时44分56秒 4 5 #include<vector> 6 #include<list&

Codeforces 833B 线段树优化 dp

Codeforces  833B  The Bakery 题意: n 个数要分成 k 块,每块的价值是其不同数的个数,问价值和最大是多少. tags: dp[i][j]表示前 j 个数分成 i 块的最大权值和,转移: dp[i][j] = max( dp[i-1][k] + val[k+1][j] ) , k是 1~j . 但这个过程其实并不好转移,要利用累加的特点,用线段树进行优化 (感觉我不看题解是想不到的,2333) 大概就是,对于第 i 层,我们假定已经知道了第 i-1 层,也就是求出了

Codeforces 803E--Roma and Poker (DP)

原题链接:http://codeforces.com/problemset/problem/803/E 题意:给一个n长度的字符串,其中'?'可以替换成'D'.'W'.'L'中的任意一种,'D'等价于0, 'W'等价于1.'L'等价于-1.输出所有'?'被替换掉后,W和L的数目之差为k,且任意一个[1, i]的子串中W和L数目之差不能等于k. 思路:用DP做.定义bool dp[i][j]代表前i个字符W和L数目之差为j, -k<=j<=k(在数组中范围为[0, 2*k]),那么当str[i]