【解题报告】洛谷P4138 挂饰
【解题报告】洛谷P4138 挂饰
题目链接
https://www.luogu.com.cn/problem/P4138
思路
设 \(f[i][j]\) 表示挂了前 \(i\) 个挂饰,还剩下 \(j\) 个挂的位置,可以得到的最大的喜悦值是多少
这就是一个背包
\[f[i][j]=max(f[i-1][j],f[i-1][max(j-c[i].a,0)+1]+c[i].b)
\]
其中如果加上挂钩之后小于零了之后,那就只挂在手机上了,所以是还剩下一个的那种情况,然后观察状态转移方程可以使用滚动数组优化一下就可以了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#define int long long
using namespace std;
const int maxn=2005;
struct node{
int a,b;
}c[maxn];
int n,ans=-1e9;
int f[5][maxn];
bool cmp(node x,node y)
{
return x.a>y.a;
}
signed main()
{
memset(f,-0x3f3f3f,sizeof(f));
cin>>n;
for(int i=1;i<=n;i++)
cin>>c[i].a>>c[i].b;
sort(c+1,c+1+n,cmp);
f[0][1]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=n;j++)
f[i&1][j]=max(f[(i-1)&1][j],f[(i-1)&1][max(j-c[i].a,1ll*0)+1]+c[i].b);
}
for(int i=0;i<=n;i++)
ans=max(ans,f[n&1][i]);
cout<<ans<<'\n';
return 0;
}
本博文为wweiyi原创,若想转载请联系作者,qq:2844938982