Codeforces Round #627 (Div. 3)E. Sleeping Schedule

比较水的dp吧。。

f ( i , j ) i j f(i,j)前i次,当前在j点睡醒。。好像是
f ( i , j ) = m a x ( f ( i 1 , j a i ) , f ( i 1 , j a i + 1 ) ) + [ l < = j < = r ] f(i,j) = max(f(i - 1 , j - ai),f(i - 1, j-ai+1)) + [l<=j<=r]
时间复杂度
O ( n m ) O(nm)
注意细节,,,一些点不行的1话要-1,然后转移要特判一下。。

#include<bits/stdc++.h>
#define MAXN 2005
using namespace std;

int n,h,l,r,maxl;
int a,f[MAXN][MAXN];

void init(){
	cin>>n>>h>>l>>r;
	memset(f , -1 , sizeof(f));
	f[0][0] = maxl = 0;
}

void solve(){
	for(int i = 1 ; i <= n ; i++){
		cin>>a;
		for(int j = 0 ; j < h ; j++){
			if(f[i - 1][(j - a + 2 * h) % h] == (-1) && f[i - 1][(j - a + 1 + 2 * h) % h] == (-1))continue;
			f[i][j] = max(f[i - 1][(j - a + 2 * h) % h] , f[i - 1][(j - a + 1 + 2 * h) % h]) + ((l <= j && j <= r) ? 1 : 0);
		}
	}
	for(int j = 0 ; j < h ; j++){
		if(f[n][j] > 99999999)continue;
		maxl = max(maxl , f[n][j]);
	}
	cout<<maxl<<endl;
}

int main(){
	init();
	solve();
}
发布了80 篇原创文章 · 获赞 3 · 访问量 1737

猜你喜欢

转载自blog.csdn.net/qq_41567618/article/details/104889242