比较水的dp吧。。
f
(
i
,
j
)
前
i
次
,
当
前
在
j
点
睡
醒
。
。
好
像
是
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]
f(i,j)=max(f(i−1,j−ai),f(i−1,j−ai+1))+[l<=j<=r]
时间复杂度
O
(
n
m
)
O(nm)
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();
}