Codeforces Round #376(Div. 2) C dp
来源:互联网 发布:php框架高级编程 pdf 编辑:程序博客网 时间:2024/06/04 17:58
题目传送门: http://codeforces.com/contest/706/problem/C
题意: 先给n个数代表倒置字符串所耗能量,再给n个字符串,有先后顺序。字符串只能被倒置,不能被替换。输出使n个字符串成功按照字典序排列所需最低能量,如果无法实现输出-1
思路:这题就是一道简单的二维dp。第二维有两种状态,0代表不倒置,1代表倒置
状态转移方程:
if(str[i] >= str[i-1]) dp[i][0] = min(dp[i][0],dp[i-1][0]);if(str[i] >= str1[i-1]) dp[i][0] = min(dp[i][0],dp[i-1][1]);if(str1[i] >= str[i-1]) dp[i][1] = min(dp[i][1],dp[i-1][0] + c[i]);if(str1[i] >= str1[i-1]) dp[i][1] = min(dp[i][1],dp[i-1][1] + c[i]);
很简单的一道题做了半天。。还是我太vegetable了
代码如下:
#include <iostream>#include <algorithm>#include <cstring>#include <stdio.h>#include <string>#include <cmath>#include <queue>#include <set>#include <map>#include <stack>#include <bitset>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define ll long long#define ull unsigned long long#define mem(n,v) memset(n,v,sizeof(n))#define MAX 100005#define MAXN 200005#define PI 3.1415926#define E 2.718281828459#define opnin freopen("text.in.txt","r",stdin)#define opnout freopen("text.out.txt","w",stdout)#define clsin fclose(stdin)#define clsout fclose(stdout)#define haha1 cout << "haha1"<< endl#define haha2 cout << "haha2"<< endl#define haha3 cout << "haha3"<< endlconst int INF = 0x3f3f3f3f;const ll INFF = 0x3f3f3f3f3f3f3f3f;const double pi = 3.141592653589793;const double inf = 1e18;const double eps = 1e-8;const ll mod = 1e9+7;const ull mx = 133333331;/**************************************************************************/int n;ll c[MAX];string str[MAX];string str1[MAX];ll dp[MAX][2];int main(){ mem(c,0); cin >> n; for(int i=1;i<=n;i++){ dp[i][0] = dp[i][1] = INFF; } for(int i=1;i<=n;i++) scanf("%I64d",&c[i]); for(int i=1;i<=n;i++){ cin >> str[i]; str1[i] = str[i]; reverse(str1[i].begin(),str1[i].end()); } dp[1][0] = 0; dp[1][1] = c[1]; for(int i=2;i<=n;i++){ if(str[i] >= str[i-1]) dp[i][0] = min(dp[i][0],dp[i-1][0]); if(str[i] >= str1[i-1]) dp[i][0] = min(dp[i][0],dp[i-1][1]); if(str1[i] >= str[i-1]) dp[i][1] = min(dp[i][1],dp[i-1][0] + c[i]); if(str1[i] >= str1[i-1]) dp[i][1] = min(dp[i][1],dp[i-1][1] + c[i]); ll Min = dp[n][0]; Min = min(Min,dp[n][1]); if(Min == INFF) cout << "-1" <<endl; else cout << Min << endl;}
0 0
- Codeforces Round #376(Div. 2) C dp
- 【DP】Codeforces Round #336 (Div. 2) C
- Codeforces Round #363 (Div. 2) C dp
- Codeforces Round #303 (Div. 2) C dp
- Codeforces Round #286 (Div. 2) C dp
- Codeforces Round #369 (Div. 2) C dp
- DP-Codeforces Round #369 Div.2-C
- Codeforces Round #376 (Div. 2) E dp
- [DP] Codeforces Round #197 (Div. 2) C. Xenia and Weights
- Codeforces Round #139 (Div. 2) C. Barcode(DP)
- Codeforces Round #FF (Div. 2/C)/Codeforces446A_DZY Loves Sequences(DP)
- Codeforces Round #260 (Div. 2)C. Boredom(dp)
- Codeforces Round #260 (Div. 2) C (DP)
- Codeforces Round #260 (Div. 2) C. Boredom【DP】
- dp解Codeforces Round #260 (Div. 2)C. Boredom
- 【DP】Codeforces Round #139 (Div. 2)225 C Barcode
- Codeforces Round #139 (Div. 2)C Barcode DP
- Codeforces Round #302 (Div. 2)C. Writing Code--dp
- 一种芯片测试装置
- 你好,世界!
- Minimum’s Revenge(弱校联盟十一专场)
- android读取通讯录和写入通讯录
- 自动获取svn版本号并替换android版本号
- Codeforces Round #376(Div. 2) C dp
- 2016中国大学生程序设计竞赛
- 用CSS实现布局(两栏布局,多栏布局)
- XML语法以及DTD的详解
- URAL 1057 Amount of Degrees 数位DP *
- HTTP协议简介
- linux各个文件夹的用途
- 全国信息学奥林匹克联赛(NOIP2016 )复赛模拟(一)
- sqoop使用中文手册