P4928 [MtOI2018] 衣服?身外之物!
P4928 [MtOI2018] 衣服?身外之物!
状态设计
看到题目发现
但是这里的状态
发现题目条件中的
状态转移
状态设计完成,接下来考虑如何转移状态。
初始化:
显然
这里很难通过
我们对于
设这个进制位的值为
如果
如果
(因为
代码:
int num = j;
while(num){
if(num % 7 != 0) status += p(7,cnt) * ((num % 7) - 1);
num /= 7;
cnt++;
}
其中函数p是
接下来处理第
如果我们选了这件衣服的话,状态
则对于每个
dp[status + y[cnt + 1] * p(7,cnt)][i] = max(dp[status + y[cnt + 1] * p(7,cnt)][i],dp[j][i - 1] + z[i] * x[cnt + 1]);
寻找答案:
判断是否“如果必定有一天gcd没有衣服穿”:
根据数据范围设计一个上界,判断答案是否小于这个上界就可以了。
至此 题目已经差不多做完了。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int MAXN = 2005;
const int INF = -2e18;
int n,m;
int x[MAXN],y[MAXN],z[MAXN];
int p(int a,int x){
int ans = 1;
for(int i = 1;i <= x;i++) ans *= a;
return ans;
}
int dp[2505][MAXN];
void print(int x){
for(int i = 1;i <= n;i++){
cout<<x % 7;
x /= 7;
}
}
signed main(){
cin>>n>>m;
for(int i = 0;i <= MAXN - 2;i++){
for(int j = 0;j <= MAXN + 500 - 2;j++){
dp[j][i] = INF;
}
}
for(int i = 1;i <= n;i++) cin>>x[i];
for(int i = 1;i <= n;i++) cin>>y[i];
for(int i = 1;i <= m;i++) cin>>z[i];
dp[0][0] = 0;
for(int i = 1;i <= m;i++){
for(int j = 0;j <= p(7,n) - 1;j++){
int status = 0;
int num = j;
int cnt = 0;
while(num){
if(num % 7 != 0) status += p(7,cnt) * ((num % 7) - 1);
num /= 7;
cnt++;
}
num = j;
cnt = 0;
for(int k = 1;k <= n;k++){
if(num % 7 == 0) {
dp[status + y[cnt + 1] * p(7,cnt)][i] = max(dp[status + y[cnt + 1] * p(7,cnt)][i],dp[j][i - 1] + z[i] * x[cnt + 1]);
}
num /= 7;
cnt++;
}
}
}
int ans = INF;
for(int j = 0;j <= p(7,n) - 1;j++){
ans = max(ans,dp[j][m]);
}
if(ans == INF) cout<<"gcd loves her clothes!";
else cout<<ans;
return 0;
}
本文来自博客园,作者:wyl123ly,转载请注明原文链接:https://www.cnblogs.com/wyl123ly/p/18428269
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!