社区讨论

马蜂良好,求调

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 条回复,欢迎继续交流。

正在加载回复...