题解:P6715 [CCO 2018] Fun Palace
huangzixi071018 · · 题解
题目大意:
有
思路:
题目让人一眼看就是
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5;
int a[N],b[N],dp[N][M];
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,m,up=0;
cin>>n>>m;
up=m;
for(int i=1;i<n;i++){
cin>>a[i]>>b[i];
up=max(up,a[i]+b[i]);
}
for(int i=0;i<m;i++){
dp[1][i]=i;
}
for(int i=1;i<n;i++){
int s=0;
for(int j=0;j<up;j++){
if(j>=a[i]+b[i]){
dp[i+1][j]=max(dp[i+1][j],dp[i][j]);
continue;
}
if(j>=a[i]){
dp[i+1][j-a[i]]=max(dp[i+1][j-a[i]],dp[i][j]);
}
if(j>=b[i]){
dp[i+1][j]=max(dp[i+1][j],dp[i][j-b[i]]+b[i]);
}
if(j<a[i]){
s=max(s,dp[i][j]);
}
}
for(int j=0;j<b[i];j++){
dp[i+1][j]=max(dp[i+1][j],s+j);
}
}
int ans=0;
for(int i=0;i<up;i++){
ans=max(ans,dp[n][i]);
}
cout<<ans<<"\n";
return 0;
}