CodeForces 607C (DP) Hard problem

题目:这里

题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于

该字符串进行或不进行这项操作,而每个字符串都有一个相应的能量值,进行操作了就要消耗那么多能量值,最后是否能在消耗的能量值最小的情况下保证这些字符串是升序的(

字典序从小到大),不能就输出-1。

字符串用string,DP,dp[i][j]表示到第i个字符串的状态为j的时候(j为1表示这个串交换了,j为0表示这个串没有交换),注意的是不能形成升序的判断,并不是任意相邻的两个字符串

能够满足升序就可以了,还要考虑前面的。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<string>
 7 using namespace std;
 8
 9 typedef long long ll;
10 #define inf 0x3f3f3f3f3f3f
11 const int M = 1e5 + 10;
12 ll v[M],dp[M][2];
13 string str[M];
14
15 string revers(string x)
16 {
17     string y=x;
18     int len=x.length();
19     for (int i=0 ; i<len/2 ; i++)
20         swap(y[i],y[len-i-1]);
21     return y;
22 }
23
24 ll min(ll x,ll y) {return x<y?x:y;}
25
26 int main()
27 {
28     int n;
29     scanf("%d",&n);
30     for (int i=1 ; i<=n ; i++) {
31         scanf("%I64d",&v[i]);
32         dp[i][0]=dp[i][1]=inf;
33     }
34     for (int i=1 ; i<=n ; i++) cin>>str[i];
35     dp[1][0]=0;dp[1][1]=v[1];
36     bool flag1=false;int i;
37     for (i=2 ; i<=n ; i++)
38     {
39         bool flag2=false;
40         if (str[i]>=str[i-1])
41             dp[i][0]=dp[i-1][0],flag2=true;
42         if (str[i]>=revers(str[i-1]))
43             dp[i][0]=min(dp[i][0],dp[i-1][1]),flag2=true;
44         if (revers(str[i])>=str[i-1])
45             dp[i][1]=dp[i-1][0]+v[i],flag2=true;
46         if (revers(str[i])>=revers(str[i-1]))
47             dp[i][1]=min(dp[i][1],dp[i-1][1]+v[i]),flag2=true;
48         //if (!flag2) {flag1=true;break;}
49         if(dp[i][1]==inf&&dp[i][0]==inf)
50                 break;
51     }
52     //if (flag1) puts("-1");
53     if (i!=n+1)puts("-1");
54     else printf("%I64d\n",min(dp[n][1],dp[n][0]));
55     return 0;
56 }
时间: 2024-12-23 21:51:23

CodeForces 607C (DP) Hard problem的相关文章

http://codeforces.com/contest/741/problem/B B. Arpa&#39;s weak amphitheater and Mehrdad&#39;s valuable Hoses

题意: 给出上限体重W 然后还给出每个人的体重wi 和 魅力值 bi 互为伙伴的对(xi, yi) 可以凑成group 思路: 并查集找出所有的group 暴力背包 对于每一个group 要选出这一组内选一个人时的最优结果, 如果所有人的体重和小于等于W,还得考虑选所有人的情况 #include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> #include &l

http://codeforces.com/contest/575/problem/B

题目链接: http://codeforces.com/contest/575/problem/B 题解: 代码: #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 1e5 + 10; const int DEG = 22; const in

Codeforces 442B Andrey and Problem(贪心)

题目链接:Codeforces 442B Andrey and Problem 题目大意:Andrey有一个问题,想要朋友们为自己出一道题,现在他有n个朋友,每个朋友想出题目的概率为pi,但是他可以同时向多个人寻求帮助,不过他只能要一道题,也就是如果他向两个人寻求帮助,如果两个人都成功出题,也是不可以的. 解题思路:贪心,从概率最大的人开始考虑,如果询问他使得概率变大,则要询问. #include <cstdio> #include <cstring> #include <a

codeforces 449D DP+容斥

Jzzhu and Numbers Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-20) Description Jzzhu have n non-negative integers a1, a2, ..., an. We will call a sequence o

CodeForces 776D The Door Problem【并查集】

CodeForces 776D The Door Problem[并查集]并查集 设 f 1--m 表示 开的情况 m+1--2*m 表示关的情况 对于每盏灯 如果他 是关的 则 x--y x+m--y+m 表示要同关 或者同开 如果他 是开的 则 x+m--y x--y+m 表示一个关 一个开如果一盏灯 的 x 连向 了 x+m 则表示是矛盾了 那么久是错误的 题意:给你n个门,和m组开关,每扇门都有两个开关控制,每个开关控制x扇门,如果选择了某组开关,则使这组开关里的每个开关控制的所有的门按

Codeforces 30D King&#39;s Problem? 模拟

首先将n个点排序,找出排序后的K,然后分情况讨论. 当 k == n+1时,显然是 k->1->n || k->n->1这两种的较小值,因为三角形的两边之和大于第三边. 当1 <= k && k <= n 时: 1 , k -> 1 -> n+1 -> k+1 ->n  ||  k -> n -> n+1 -> k-1 -> 1,当k+1 || k-1 不存在时将对应步骤忽略. 2 , k - > 1

Codeforces 1019C Sergey&#39;s problem 其他

原文链接https://www.cnblogs.com/zhouzhendong/p/CF1019C.html 题目传送门 - CF1019C 题意 给定一个有 $n$ 个节点 . $m$ 条边的有向图,没有自环,但是可能存在环. 现在要求选出一个点集满足一下条件. 设原来的所有点构成的点集为 $V$ ,选出的点集为 $S$,则: 1. 对于所有满足 $x,y\in S$ 的点 $x,y$ ,有向边 $(x,y)$ 不存在. 2. 对于所有满足 $x\in S,y\in V$ 的点,点 $x$

[Codeforces 986E] Prince&#39;s Problem

[题目链接] https://codeforces.com/contest/986/problem/E [算法] X到Y的路径积 , 可以转化为X到根的路径积乘Y到根的路径积 , 除以LCA到根的路径积 , 再除以LCA父节点到根的路径积 考虑如何计算根到X路径上每个点与Value的GCD之积 不妨对于每个质数P开一个数组cnt[] , 表示根到当前节点P^i有多少个 , 我们可以在DFS的过程中维护这个数组 将询问离线即可 时间复杂度 : O(V + NlogN + QlogV^2) [代码]

Frets On Fire --- 2019 Codeforces Global Round 2 Problem D

原题:https://codeforces.com/contest/1119/problem/D 题意大概是一个n行1e18列的矩阵,其中每行第一个数为s[i],剩下的数每行依次以1的速度递增.就是说,矩阵元素 a[i][j] = s[i] + j .有q个询问,每个询问有两个参数l,r,求矩阵第l列到第r列(所有行)一共出现了几个不同的数. 这道题首先要先想到,两个参数 [l,r] 其实等价于一个参数 [0,r-l] ,也就是说矩阵第0~r-l行出现的数字的个数其实和第l-r行出现的个数是一样