[説明]通りオフ

質問

思考が固化出たくなかった反映して...... ......

セット\(DP [I] [J ] [0/1] \) 間隔を表す(\ \テキスト{[I、 J]} \) のライトオフすべてのターンとで停止\((I-> 0、J > 1)\)最小コストの場所。

次に、\(DP [I] [J] [0] \)([0/1] \ DP [I + 1] [J])\ 転送、\(DP [I] [J] [1] \ )\(DP [I]、[J -1] [0/1] \) 転送。

注我々は閉区間を求めること(\ \テキスト{[I、 J]} \) エネルギーの最小値。したがって、我々オフの時間を計算するために使用される各1、の光が他のすべてのライトに関連していないが、上記行きます。

言い換えれば、あなたは合計答えをするたびに、あなただけ消費されるために、この光エネルギーをシャット。

我々は更新されない、または約各レベルの統計上のランプので、現在のライトの消費は、時間のかかることで発生するので、それは重量・カウントは発生しません。

この式は、転送順序があることを次の音符\(\ + I {テキスト1 I、J-Jに。1} \)ように列挙ときに、\(I \)は、逆結合(J \)\必ずしも順序を。

どのように列挙考えてみましょう。

明らかに、我々はすでに知っている\(C \)父の開始位置という答え。だから、私たちの答えはスプレッドにこの位置に基づいている必要があります。

また、注目すべきこと(I、J \)\からでなければなりません(\ C)\だから場合は、起動します。

\(iは1に\ Cを= = I \ \ nまで、j)は、その後、私たちの\(DP \)の配列を適切に更新することができます。

別の方法があります:あなたができる最初の列挙\(J \)

列挙:\(J = C \にN- ,. 1-Iは\ Jが= 1〜\。) 同じ問題。

したがって、2つのコードを提供することができるHI \(\カラーグリーン{} {} AC \)

#include<bits/stdc++.h>
using namespace std;
int n,c;
int a[500],w[500],p[500];
int dp[51][51][2];
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
int main(){
	scanf("%d%d",&n,&c);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&a[i],&w[i]);
		p[i]=p[i-1]+w[i];
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			dp[i][j][1]=dp[i][j][0]=99999;
	dp[c][c][1]=dp[c][c][0]=0;
	for(int i=c;i>=1;--i){
		for(int j=i+1;j<=n;++j){
			dp[i][j][0]=min(dp[i+1][j][0]+(a[i+1]-a[i])*(p[i]+p[n]-p[j]),
							dp[i+1][j][1]+(a[j]-a[i])*(p[i]+p[n]-p[j]));
							
			dp[i][j][1]=min(dp[i][j-1][1]+(a[j]-a[j-1])*(p[i-1]+p[n]-p[j-1]),
							dp[i][j-1][0]+(a[j]-a[i])*(p[i-1]+p[n]-p[j-1]));
		}
	}
	printf("%d\n",min(dp[1][n][1],dp[1][n][0]));
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,c;
int a[500],w[500],p[500];
int dp[51][51][2];
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
int main(){
	scanf("%d%d",&n,&c);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&a[i],&w[i]);
		p[i]=p[i-1]+w[i];
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			dp[i][j][1]=dp[i][j][0]=99999;
	dp[c][c][1]=dp[c][c][0]=0;
	for(int j=c;j<=n;++j){
		for(int i=j-1;i>=1;--i){
			dp[i][j][0]=min(dp[i+1][j][0]+(a[i+1]-a[i])*(p[i]+p[n]-p[j]),
							dp[i+1][j][1]+(a[j]-a[i])*(p[i]+p[n]-p[j]));
							
			dp[i][j][1]=min(dp[i][j-1][1]+(a[j]-a[j-1])*(p[i-1]+p[n]-p[j-1]),
							dp[i][j-1][0]+(a[j]-a[i])*(p[i-1]+p[n]-p[j-1]));
		}
	}
	printf("%d\n",min(dp[1][n][1],dp[1][n][0]));
	return 0;
}

二つの列挙順序コードがなく、すべての上に、異なっています。

概要:\(DP \)時の状態から、最初の設計の状態のノート、および注意どこ打ち上げ、次に考える\(DP \)列挙方法を。

リフレクション。料理は原罪であります

おすすめ

転載: www.cnblogs.com/h-lka/p/12623558.html