Codeforces Round #267 (Div. 2) 解題報告

N久沒做過cf了,今天心血來潮搞了一個,唉,坑爹的D題,卡了N久

解題:

A題George and Accommodation

直接暴力


B題Fedor and New Game

也是直接暴力


C題George and Jo

題目:

給定一個序列,給定一個塊的大小m(必須爲連續),給定k個塊(不能交叉,只能順序),求k塊之和最大是多少。

簡單DP,狀態轉移方程:

f[i][j] = max(f[i - 1][j], f[i - m][j - 1] + sum[i - m]);

其中i表示遍歷原數組到i爲止,j表示第j組(一共k組),sum[i - m]表示以i - m爲開頭的連續的塊和

代碼:

#include<iostream>
#include<cstdio>
#include<memory.h>
#include<queue>
#include<cmath>
#include<stack>
#include<cstdlib>
#include<vector>
#include<string>
#include<cstring>
#include<map>

using namespace std;
#define Clear(f, nr) memset(f, nr, sizeof(f))
const int SIZE = 5005;
const int MSIZE = 10000;
typedef long long ll;
const int INF = 1 << 30;

long long f[SIZE][SIZE];
long long sum[SIZE];
int a[SIZE];

int main() {
	int n, m, k;
	while(cin >> n >> m >> k) {
		for(int i = 0; i < n; i ++)
			cin >> a[i];
		Clear(sum, 0);
		for(int i = 0; i < m; i ++)
			sum[0] += a[i];
		for(int i = 1; i < n - m + 1; i ++)
			sum[i] = sum[i - 1] - a[i - 1] + a[i + m - 1];
		for(int i = 0; i < n; i ++)
			f[i][0] = 0;
		f[m - 1][1] = sum[0];
		for(int i = m; i < n; i ++) {
			for(int j = 1; j <= k; j ++)
				f[i][j] = max(f[i - 1][j], f[i - m][j - 1] + sum[i - m + 1]);
		}
		cout << f[n - 1][k] << endl;
	}
}


D題Fedor and Essay

給定一個字符串序列,求替換其中的字符串使得替換後的數據含單詞r最少(忽略大小寫),如果r一致,則輸出長度最小的。

解題:

暴力搞得,一開始卡第六組數據,後來發現可以循環替換a->b->c....一直替換下去

結果還是卡第七組數據。。。。

我的思路就是替換 如果想要替換a爲b

則b中要麼r比a少,要麼b字符串比a短。

後來發現思路是錯的,根據第7組數據:

5
aa bb cc ee ff
5
aa a
bb aa
cc bb
ee cc
ff bb
按我的思路替換是不對的。

因爲數據替換張成了一棵樹,需要dfs遍歷找到替換最優解(根據以上的替換規則,必爲葉子結點)
完了dfs時再把中間壓縮一下,中間節點直接map到最優葉子節點

由於中間過程存在環,還要強連通縮點,重構圖。

代碼寫的太亂了,不發了。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章