リニアDPの礼拝(ロス・バレーP1564)

礼拝

タイトル説明

多くの神聖な牛があります...もちろん...それぞれの生徒は、神聖な牛の自分の心から崇拝しています。

AとBの神聖な牛の牛聖なる牛の2校があります。新しく入学し、学生のNビットは、彼らの神話を聞いていました。

したがって、それは心からの礼拝の一つとなっています。さて、教師ポイントがそれらの部屋を得ました。しかし、部屋全体が同じ神は牛によって崇拝、または全くつ以上の牛Mの崇拝者の数との差のいずれかであることを保証します。さらに、今の行のnビットの生徒、教師であろう部屋に学生だけ連続したサブセクション。教師は少なくとも必要があるどのように多くの部屋を知りたいと思いました。

入力形式

入力ファイルの最初の行は二つの整数nとmを含有します。

(N + 1)行目、1の即ち整数に対するライン非あたり2秒、(I + 1)行は、礼拝のi番目の学生オブジェクトの整数を表し、Aは、Bは2を表し、1を表します。

出力フォーマット

出力最低限必要な部屋の数を表す整数。


2 -1となる、被験者がに変換することができる:段落の連続した文字列に長さnは、各セグメントの絶対値<= M、セグメントの最小数を見つけます。

状態遷移式:DP [I] =分(DP [J] + 1、DP [I])は、jはi、jは確保する前方位置であり、この部分と、iの絶対値<= M、N複雑^ 2;

コード:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=3000;
const int M=2000100;
const int mod=1e9;
int sum[N],a[N],dp[N];
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]==2) a[i]=-1;
		sum[i]=sum[i-1]+a[i];
		dp[i]=2e9;
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<i;j++){
			if(abs(sum[i]-sum[j])<=m||abs(sum[i]-sum[j])==i-j) dp[i]=min(dp[j]+1,dp[i]);
		}
	}
	cout<<dp[n]<<endl;
	return 0;
}
公開された264元の記事 ウォン称賛46 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_44291254/article/details/105336538
おすすめ