社区讨论
马蜂良好,求调
P4912帕秋莉的魔法参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhz44077
- 此快照首次捕获于
- 2025/11/15 01:08 4 个月前
- 此快照最后确认于
- 2025/11/16 13:41 4 个月前
主要的思路在代码注释里
WA on #6~9,实在找不到问题了来问问大佬们
CPP#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 5e1 + 7;
const int MAXM = 8e3 + 7;
const int mov = 2500;
struct Spell{
int len,por;
int w[MAXN];
}spell[MAXN];
int n,m;
int dp[MAXM][MAXN];//dp[i][j]表示念长为 i 的咒语时、最后一条咒语的编号为 j 的最大威力
void test_print(){
for(int i = 1;i <= m;i++){
for(int j = 1;j <= n;j++){
printf("%d ",dp[i + mov][j]);
}
printf("\n");
}
printf("\n");
}
int main(){
memset(dp,-0x3f,sizeof(dp));
dp[mov][0] = 0;
cin >> n >> m;
for(int i = 1;i <= n;i++){
cin >> spell[i].len >> spell[i].por;
spell[i].len += mov;
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
cin >> spell[i].w[j];
}
}
// m += mov;
for(int i = 1;i <= n;i++){//枚举最后一条咒语
for(int lenth = mov * 2;lenth >= spell[i].len;lenth--){//枚举咒语长度(01背包倒序)
for(int k = 0;k < i;k++){//枚举上一条咒语
if(dp[lenth - spell[k].len][k] != -INF){
dp[lenth][i] = max(dp[lenth][i],dp[lenth - (spell[i].len - mov)][k] + spell[i].por + spell[k].w[i]);
}
// test_print();
}
}
}
int ans = -0x3f3f3f3f;
for(int i = 1;i <= n;i++){
ans = max(ans,dp[m + mov][i]);
}
if(ans <= -5000){
printf("-1");
}else{
printf("%d",ans);
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...