BZOJ4247_挂饰_KEY
2024-08-26 14:53:14
背包的变形,不得不说卡了我很久(估计是下午睡傻了)。
设f[i][j]为前i个物品剩下j个挂钩。
f[i][j]=max(f[i-1][j],f[i-1][max(j-a[i].x,0)+1]);
显然f[i-1][j]表示不挂,而f[i-1][max(j-a[i].x,0)+1]表示挂。
第二个之所以+1是因为原本就有一个钩子。j-a[i].x表示转移前的钩子数量。
有一点很重要,那就是要对钩子数量从大到小排列,不然的话会产生后效性。
因为如果钩子多的在钩子少的后面,那么两者就可以对换。
code:
/**************************************************************
Problem: 4247
User: yekehe
Language: C++
Result: Accepted
Time:2728 ms
Memory:17516 kb
****************************************************************/ #include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; char tc()
{
static char fl[],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,,,stdin),A==B)?EOF:*A++;
} int read()
{
char c;while(c=tc(),(c<''||c>'')&&c!='-');
int x=,y=;c=='-'?y=-:x=c-'';
while(c=tc(),c>=''&&c<='')x=x*+c-'';
return x*y;
} const int MAXN=;
int N,f[MAXN][MAXN];
struct node{
int x,y;
}a[MAXN];
int cmp(node x,node y){return x.x>y.x;} int main()
{
// freopen("x.txt","r",stdin);
N=read();
for(int i=;i<=N;i++)a[i].x=read(),a[i].y=read();
memset(f,-,sizeof(f));
sort(a+,a+N+,cmp);
f[][]=;
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)
f[i][j]=max(f[i-][j],f[i-][max(,j-a[i].x)+]+a[i].y);
int ans=;
for(int i=;i<=N;i++)ans=max(f[N][i],ans);
printf("%d",ans);
return ;
}
最新文章
- WinXP/Win7/Win8本地用户配置文件迁移至域用户
- 最后一周psp
- WebForm Repeater Response以及 地址栏
- 【Python自动化运维之路Day7】
- 怎样用ZBrush中的Curves和Insert笔刷创建四肢
- jquery/js特效代码总结(一):tab切换
- js字符串截取函数slice()、substring()、substr()
- 【BZOJ 3674】可持久化并查集加强版&;【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之
- margin负值
- 112. Path Sum
- WordPress防暴力破解:安全插件和用.htpasswd保护WordPress控制面板
- sql第二天
- File文件操作类
- 我的iOS-App
- 蓝桥杯-括号问题-java
- SpringBoot(五):@ConfigurationProperties配置参数绑定
- 2025战略,中秋送福利!免费开源ERP Odoo Windows 一键傻瓜式安装版发布
- QT 启动shell脚本
- 开启mysql远程访问过程中所遇常见问题的解决办法
- 使用Groovy+Spock轻松写出更简洁的单测