codeforces 1096D. Easy Problem

本文深入解析Codeforces上的一道难题,题目要求将含有特定子序列的字符串转化为非困难字符串,通过最小化删除字符的权值来实现。文章详细介绍了使用动态规划解决此问题的思路与代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:http://codeforces.com/problemset/problem/1096/D

 

 

 

题意:给出一个字符串,每个字符对应一个权值,如果其中有子序列“hard”,就称是困难的字符串,求将其改成非困难的字符串最少需要删除字符的权值。

 

#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iterator>
#include <ctime>
#include <algorithm>
#include <bitset>
#include <deque>
#include <iostream>
#include <iomanip>
#include <limits>
#include<functional>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <utility>
#include <vector>
#include <numeric>
#define inf  1<<30
#define mod 1000000007
#define seed 131
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) ((x)&(-x))
#define lrtnb srand(unsigned(time(NULL)))
#define lrtlh ios::sync_with_stdio(0)
#define lowb(a,n,x) lower_bound(a,a+n,x) - a
#define uppb(a,n,x) upper_bound(a,a+n,x) - a
#define lson l,mid,i<<1;
#define rson mid+1,r,i<<1|1;
#define ALL(x) x.begin(),x.end()
#define inv inline void
#define INS(x) inserter(x,x.begin())
using namespace std;
typedef long long ll;
typedef long double ld;

typedef priority_queue<int> pqi;
typedef priority_queue<ll> pql;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef map<int, int> mii;
typedef map<ll, ll> mll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef queue<int> qi;
typedef queue<ll> ql;
typedef stack<int> si;
typedef stack<ll> sl;
typedef set<int> Si;
typedef set<ll> Sl;
ll gcd(ll n, ll m) { long long t, r; if (n < m)swap(n, m); while (m) { r = n % m; n = m; m = r; }return n; }
ll lcm(ll b, ll y) { return b * y / gcd(b, y); }
//double dis(double x1, double x2, double y1, double y2) { double ans = (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2); return sqrt(ans); }
double random(double start, double en) { return start + (en - start)*rand() / (RAND_MAX + 1.0); }
void read(int &n) { char c = '+'; int x = 0; bool flag = 0; while (c<'0' || c>'9') { c = getchar(); if (c == '-')flag = 1; }while (c >= '0'&&c <= '9')x = x * 10 + c - 48, c = getchar(); n = flag == 1 ? -x : x; }
ll dp[100010][5];
int main()
{
	ll n;
	string s;
	while (cin >> n >> s) {
		mem(dp, 0);
		ll q;
		for (int i = 0; i < n; i++) {
			cin >> q;
			if (s[i] == 'h') {
				dp[i + 1][0] = q + dp[i][0];
				dp[i + 1][1] = dp[i][1];
				dp[i + 1][2] = dp[i][2];
				dp[i + 1][3] = dp[i][3];
			}
			else if (s[i] == 'a') {
				dp[i + 1][1] = min(q + dp[i][1], dp[i][0]);
				dp[i + 1][0] = dp[i][0];
				dp[i + 1][2] = dp[i][2];
				dp[i + 1][3] = dp[i][3];
			}
			else if (s[i] == 'r') {
				dp[i + 1][2] = min(q + dp[i][2], dp[i][1]);
				dp[i + 1][0] = dp[i][0];
				dp[i + 1][1] = dp[i][1];
				dp[i + 1][3] = dp[i][3];
			}
			else if (s[i] == 'd') {
				dp[i + 1][3] = min(q + dp[i][3], dp[i][2]);
				dp[i + 1][0] = dp[i][0];
				dp[i + 1][1] = dp[i][1];
				dp[i + 1][2] = dp[i][2];
			}
			else {
				dp[i + 1][0] = dp[i][0];
				dp[i + 1][1] = dp[i][1];
				dp[i + 1][2] = dp[i][2];
				dp[i + 1][3] = dp[i][3];
			}
		}
		cout << dp[n][3] << endl;
	}
	//system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值