Codeforces Round #367 (Div. 2)-C - Hard problem-DP
2016-08-12 03:00
411 查看
题意:给字符串n个,
能否通过逆序某些字符串,使得最后整体字典序递增。
每个字符串翻转需要花费,输出最小花费使得 整体字典序递增
dp[i][0]表示第i个字符串选择不翻转的花费
dp[i]【1】表示要翻转的花费
简单dp一下就好了。。最后答案判断是否超过IN
if (ss[i]>=ss[i-1])
dp[i][0]=min(dp[i][0],dp[i-1][0]);
if (rev_ss[i]>=ss[i-1])
dp[i][1]=min(dp[i][1],c[i]+dp[i-1][0]);
if (ss[i]>=rev_ss[i-1])
dp[i][0]=min(dp[i][0],dp[i-1][1;
if (rev_ss[i]>=rev_ss[i-1])
dp[i][1]=min(dp[i][1],c[i]+dp[i-1][1]);
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
typedef long long ll;
string ss[100123];
string rev_ss[100123];
ll c[100123];
ll dp[100123][2];
char tmp[100123];
char tt[100123];
int ok[100123][2];
int main()
{
int n;
cin>>n;
for (int i=1; i<=n; i++) scanf("%lld",&c[i]);
for (int i=1; i<=n; i++)
{
scanf("%s",tmp);
ss[i]=tmp;
int len=strlen(tmp);
for (int j=0; j<len; j++)
tt[j]=tmp[len-j-1];
tt[len]=0;
rev_ss[i]=tt;
}
for (int i=1; i<=n; i++)
dp[i][0]=dp[i][1]=1e16;
dp[0][0]=dp[0][1]=0;
ok[0][1]
=ok[0][0]=1;
for (int i=1; i<=n; i++)
{
if (ok[i-1][0])
{
if (ss[i]>=ss[i-1])
dp[i][0]=min(dp[i][0],dp[i-1][0]),ok[i][0]=1;
if (rev_ss[i]>=ss[i-1])
dp[i][1]=min(dp[i][1],c[i]+dp[i-1][0]),ok[i][1]=1;
}
if (ok[i-1][1])
{
if (ss[i]>=rev_ss[i-1])
dp[i][0]=min(dp[i][0],dp[i-1][1]),ok[i][0]=1;
if (rev_ss[i]>=rev_ss[i-1])
dp[i][1]=min(dp[i][1],c[i]+dp[i-1][1]),ok[i][1]=1;
}
}
if (ok
[0]==0&&
ok
[1]==0)
{
printf("-1\n");
return 0;
}
printf("%lld\n",min(dp
[0],dp
[1]));
return 0;
}
能否通过逆序某些字符串,使得最后整体字典序递增。
每个字符串翻转需要花费,输出最小花费使得 整体字典序递增
dp[i][0]表示第i个字符串选择不翻转的花费
dp[i]【1】表示要翻转的花费
简单dp一下就好了。。最后答案判断是否超过IN
if (ss[i]>=ss[i-1])
dp[i][0]=min(dp[i][0],dp[i-1][0]);
if (rev_ss[i]>=ss[i-1])
dp[i][1]=min(dp[i][1],c[i]+dp[i-1][0]);
if (ss[i]>=rev_ss[i-1])
dp[i][0]=min(dp[i][0],dp[i-1][1;
if (rev_ss[i]>=rev_ss[i-1])
dp[i][1]=min(dp[i][1],c[i]+dp[i-1][1]);
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
typedef long long ll;
string ss[100123];
string rev_ss[100123];
ll c[100123];
ll dp[100123][2];
char tmp[100123];
char tt[100123];
int ok[100123][2];
int main()
{
int n;
cin>>n;
for (int i=1; i<=n; i++) scanf("%lld",&c[i]);
for (int i=1; i<=n; i++)
{
scanf("%s",tmp);
ss[i]=tmp;
int len=strlen(tmp);
for (int j=0; j<len; j++)
tt[j]=tmp[len-j-1];
tt[len]=0;
rev_ss[i]=tt;
}
for (int i=1; i<=n; i++)
dp[i][0]=dp[i][1]=1e16;
dp[0][0]=dp[0][1]=0;
ok[0][1]
=ok[0][0]=1;
for (int i=1; i<=n; i++)
{
if (ok[i-1][0])
{
if (ss[i]>=ss[i-1])
dp[i][0]=min(dp[i][0],dp[i-1][0]),ok[i][0]=1;
if (rev_ss[i]>=ss[i-1])
dp[i][1]=min(dp[i][1],c[i]+dp[i-1][0]),ok[i][1]=1;
}
if (ok[i-1][1])
{
if (ss[i]>=rev_ss[i-1])
dp[i][0]=min(dp[i][0],dp[i-1][1]),ok[i][0]=1;
if (rev_ss[i]>=rev_ss[i-1])
dp[i][1]=min(dp[i][1],c[i]+dp[i-1][1]),ok[i][1]=1;
}
}
if (ok
[0]==0&&
ok
[1]==0)
{
printf("-1\n");
return 0;
}
printf("%lld\n",min(dp
[0],dp
[1]));
return 0;
}
相关文章推荐
- 【Codeforces Round 367 (Div 2) C】【简单DP】Hard problem
- Codeforces Round #367 (Div. 2) C. Hard problem (dp)
- Codeforces Round #367 (Div. 2)C. Hard problem
- Codeforces Round #360 (Div. 2) -- C. NP-Hard Problem (DFS二分图染色法)
- Codeforces Round #174 (Div. 2)---D. Cow Program(dp, 记忆化搜索)
- 【Codeforces Round 367 (Div 2) E】【十字链表 边框维护】Working routine nm矩形交换q次子矩形的最终矩形
- Codeforces Round #360 (Div. 2) -- C. NP-Hard Problem (DFS二分图染色法)
- Codeforces Round #277.5 (Div. 2) E. Hiking(二分 DP)
- Codeforces Round #Pi (Div. 2) C. Geometric Progression dp
- Codeforces Round #401 (Div. 2) A B C 水 贪心 dp
- Codeforces Round #265 (Div. 1) C. Substitutes in Number dp
- Codeforces Round #274 Div.1 C Riding in a Lift --DP
- Codeforces Round #370 (Div. 2) D. Memory and Scores(DP)
- Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks(矩阵优化DP)
- Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrda 4000 d's valuable Hoses —— DP(01背包)
- Codeforces Round #365 (Div. 2)Mishka and Divisors 题解。 DP
- Codeforces Round #367 (Div. 2) B. Interesting drink 树状数组
- Codeforces Round #367 (Div. 2)E
- Codeforces Round #360 (Div. 2) C. NP-Hard Problem
- Codeforces Round #360 (Div. 1) A. NP-Hard Problem(二分图染色)