Codeforces 1322Dリアリティショー(DP)

トピックリンク

https://codeforces.com/contest/1322/problem/D
非常にあいまい表面に書かれたタイトルは、それは質問を読み違えるのは簡単です、提案された参照翻訳:https://www.luogu.com.cn/problem/CF1322D

問題の解決策

(最大の困難は、質問を読むことです?枯れこんにゃくの日を探している問題の解決策を理解していなかった、間違った質問を読んでいない)
何も選出されたと仮定して検討する(L_iを\)\そして、答えがあると注文独立し、上限を増加させない、なぜなら選挙で回数うち固定セットの各回答の後、すべての貢献は、右ビット数で除算し、このビットの丸みに等しいか小さい値です。
次のDPを書くことができる:\(F [J] [K] \)の考慮を表し\(0 \)に番目のビット(J \)\ビットと正確\(K \)に等しい番目(\ J \)ビット(最初に相当\(J \)ビット寄与\(K \) )、転送が列挙するの数を選択することができます。
今選択が必要\(L_iを\)にのみから前方スイープ(DPがローからハイに遷移元のためでもある)、増加しない、各テーブルは、ブラシができます。\([L [I] F ] [k]が\) に転送することができる\(F [L [I] + J] [\ lfloor \ FRAC {K + 1} {2 ^ J} \ rfloor] \)
時間実装の複雑さがあるべきIとして\(O((N ^ 2 + nm)を\ n型ログ)\)
どの妖精ティーチ私を\(O(N ^ 2 + nm)を\) 文言ああ/ KEL

コード

#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
#define riterator reverse_iterator
#define y1 Lorem_ipsum_dolor
using namespace std;

inline int read()
{
	int x = 0,f = 1; char ch = getchar();
	for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}
	for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}
	return x*f;
}

const int mxN = 2e3;
int c[mxN+3],a[mxN+3],w[mxN+mxN+3];
int f[mxN+mxN+3][mxN+3];
int mx[mxN+mxN+3];
int n,m;

void updmax(int &x,int y) {x = max(x,y);}

int main()
{
	n = read(),m = read();
	for(int i=1; i<=n; i++) c[i] = read();
	for(int i=1; i<=n; i++) a[i] = read();
	for(int i=1; i<=n+m; i++) w[i] = read();
	memset(f,213,sizeof(f));
	for(int i=1; i<=n+m; i++) f[i][0] = 0;
	for(int i=n; i>=1; i--)
	{
		for(int k=mx[c[i]]; k>=0; k--)
		{
			int tmp = k+1,val = -a[i]+w[c[i]];
			for(int j=0; tmp; j++,tmp>>=1,val+=w[c[i]+j]*tmp)
			{
				updmax(mx[c[i]+j],tmp);
				updmax(f[c[i]+j][tmp],f[c[i]][k]+val);
			}
		}
		for(int j=1; j<=n+m; j++) {updmax(f[j][0],max(f[j-1][0],f[j-1][1]));}
	}
	printf("%d\n",f[n+m][0]);
	return 0;
}

おすすめ

転載: www.cnblogs.com/suncongbo/p/12561232.html