<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      P9688

      \(Solution\)

      考慮 dp。

      觀察數據范圍,\(n,k\leq 500\) 的數據幾乎明示了同階下 \(\Theta(n^3)\) 的算法了。那么直接往這里考慮。

      \(f_{i,j}\) 為當前是第 \(i\) 中顏色,且已經選了 \(j\) 種顏色的最大值。

      那么有以下轉移方程:

      \[f_{i,k}=\max^{i-1}_{j=1} cmp(i,j)\land f_{j,k-1} \]

      其中 \(cmp\) 函數為判斷兩個顏色是否有交叉段,即是否呈單調不下降序列。當然這兩個顏色必須存在。

      那么我們記兩個數組 \(front,back\) 為當前顏色最早和最后出現的位置即可。

      \(\mathcal{Code}\)

      #include<bits/stdc++.h>
      using namespace std;
      #define int long long
      constexpr int N = 500 + 5;
      int a[N], b[N], up[N], down[N], ans, f[N][N];
      signed main() {
      	auto read = [&]() -> auto {
      		int x = 0, m = 1;
      		char ch = getchar();
      		while (!isdigit(ch)) {
      			if (ch == '-') m = -1;
      			ch = getchar();
      		}
      		while (isdigit(ch)) {
      			x = x * 10 + ch - 48;
      			ch = getchar();
      		}
      		return x * m;
      	};
      
      	function<void(int)> write = [&](int x) {
      		if (x < 0) {
      			putchar('-');
      			write(-x);
      			return ;
      		}
      		if (x >= 10) write(x / 10);
      		putchar(x % 10 + '0');
      	};
      
      	auto writeln = [&](int x) -> auto {
      		write(x), putchar('\n');
      	};
      
      	auto writesp = [&](int x) -> auto {
      		write(x), putchar(' ');
      	};
      
      	int n = read(), m = read();
      	for(int i = 1; i <= n; i ++) {
      		a[i] = read();
      		if(!up[a[i]]) up[a[i]] = i;
      	}
      	for(int i = n; i; i --) if(!down[a[i]]) down[a[i]] = i;
      	for(int i = 1; i <= n; i ++) b[i] = read();
      	for(int i = 1; i <= n; i ++) {
      		f[i][1] = b[i];
      		for(int j = 1; j < i; j ++) {
      			if(down[j] > up[i] || !down[j] || !up[i]) continue;
      			for(int k = 2; k <= m; k ++) {
      				if(!f[j][k - 1]) continue;
      				f[i][k] = max(f[i][k], f[j][k - 1] + b[i]);
      			}
      		}
      		ans = max(ans, f[i][m]);
      	}
      	if(!ans) cout << -1 << '\n';
      	else cout << ans << '\n';
      	return 0;
      }
      
      posted @ 2023-10-02 21:40  The_cosmos  閱讀(68)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 福利视频一区二区在线| 99久久国产成人免费网站| 少妇撒尿一区二区在线视频| 国产精品自在线拍国产手机版| 亚洲免费人成在线视频观看| 免费国产一区二区不卡| 久久人人妻人人爽人人爽| 国产精品亚洲二区在线播放| 国产视频一区二区在线看| 色偷偷久久一区二区三区| 亚洲一二三区精品与老人| 免费视频欧美无人区码 | 亚洲综合91社区精品福利| 亚欧洲乱码视频在线观看| 大伊香蕉精品一区视频在线| 久久综合亚洲鲁鲁九月天| 久久午夜无码鲁丝片午夜精品| 91精品人妻中文字幕色| 国产成人午夜在线视频极速观看| 国产精品一区中文字幕| 亚洲视频欧美不卡| 丰满无码人妻热妇无码区| 蜜臀91精品国产高清在线| 精品无码国产自产拍在线观看蜜| 国产精品综合av一区二区国产馆| 国产剧情91精品蜜臀一区| 高级艳妇交换俱乐部小说| 久久久久免费看成人影片| 国产成人无码免费视频在线| 中文人妻熟妇乱又伦精品| 69精品无人区国产一区| 欧美国产综合欧美视频| 午夜通通国产精品福利| 天天爽夜夜爱| 一区二区三区av天堂| 国产绿帽在线视频看| 亚洲精品国产av成人网| 无码尹人久久相蕉无码| 成人3D动漫一区二区三区| 亚洲av综合色一区二区| 亚洲国产性夜夜综合 |