N久沒做過cf了,今天心血來潮搞了一個,唉,坑爹的D題,卡了N久
解題:
直接暴力
也是直接暴力
題目:
給定一個序列,給定一個塊的大小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;
}
}
給定一個字符串序列,求替換其中的字符串使得替換後的數據含單詞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到最優葉子節點
由於中間過程存在環,還要強連通縮點,重構圖。
代碼寫的太亂了,不發了。。。