动态规划

作业介绍

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
const int Mod = 1e9+7;
signed f[100005],sum[100005];
signed main(){
	f[0] = 1;
	cin>>n>>k;
	for(int i=1;i<=100000;i++){
		f[i] = f[i-1];
		if(i>=k)f[i]+=f[i-k];
		f[i]%=Mod;
		sum[i] = sum[i-1]+f[i];
		sum[i]%=Mod;
	}
	for(int i=1;i<=n;i++){
		int l,r;
		cin>>l>>r;
		cout<<(Mod+sum[r]-sum[l-1])%Mod<<endl;
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 105,Mod=1e9+7;
#define int long long
int n,k,d;
int f[N][2];
signed main(){
	cin>>n>>k>>d;
	f[0][0] = 1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=min(i,k);j++){
			if(j<d){
				f[i][0]+=f[i-j][0];
				f[i][0]%=Mod;
			}
			f[i][1]+=f[i-j][1];
			f[i][1]%=Mod;
			if(j>=d){
				f[i][1] += f[i-j][0];
				f[i][1]%=Mod;
			}
		}
	}
	cout<<f[n][1]<<endl;
	return 0;
} 
#include <bits/stdc++.h>
using namespace std;
int n,a,b,c;
int f[4005];
int main(){
	cin>>n>>a>>b>>c;
	memset(f,-1,sizeof(f));
	f[0] = 0;
	for(int i=1;i<=n;i++){
		if(i>=a && f[i-a]!=-1)f[i] = max(f[i],f[i-a]+1);
		if(i>=b && f[i-b]!=-1)f[i] = max(f[i],f[i-b]+1);
		if(i>=c && f[i-c]!=-1)f[i] = max(f[i],f[i-c]+1);
		//cout<<i<<" "<<f[i]<<endl;
	}
	cout<<f[n]<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
//f[i]到坐标i最多能保留的信标数
//f[i] = f[i-1]
//f[i] = f[i-x]+1
int n,b[1000005],f[1000005];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		b[x] = y;
	}
	int res = 0;
	for(int i=0;i<=1000000;i++){
		if(b[i]==0){
			f[i] = f[i-1];
		}
		else{
			if(b[i]>i)f[i] = 1;
			else f[i] = f[i-b[i]-1]+1;
		}
		res = max(res,f[i]);
	}
	cout<<n-res<<endl;
	return 0;
}
状态
已结束
题目
13
开始时间
2026-3-28 0:00
截止时间
2026-4-5 23:59
可延期
24 小时