社区讨论

为何第二维循环容量(j)时正序倒序均可AC?

P2014[CTSC1997] 选课参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mi86agx5
此快照首次捕获于
2025/11/21 09:19
4 个月前
此快照最后确认于
2025/11/21 09:19
4 个月前
查看原帖
CPP
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<vector>
#define MAXN 310
using namespace std;
vector<int> root[MAXN];
int id[MAXN],di[MAXN],rt[MAXN],dp[MAXN][MAXN];
void dfs(int u){
	static int cnt;
	id[u]=cnt;
	di[cnt]=u;
	cnt++;
	for(int i=0;i<root[u].size();i++){
		int v=root[u][i];
		dfs(v);
	}
	rt[id[u]]=cnt;
}
int v[MAXN];
int main(){
	int m,n;
	cin>>n>>m;
	int k1,k2;
	for(int i=1;i<=n;i++){
		cin>>k1>>k2;
		v[i]=k2;
		root[k1].push_back(i);
	}
	dfs(0);
	for(int i=n;i>=0;i--){
		** _for(int j=m+1;j>=0;j--)_ **{
			if(j>=1)
				dp[i][j]=max(dp[rt[i]][j],dp[i+1][j-1]+v[di[i]]);
		}
	}
	cout<<dp[0][m+1];
	return 0;
}
CPP
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<vector>
#define MAXN 310
using namespace std;
vector<int> root[MAXN];
int id[MAXN],di[MAXN],rt[MAXN],dp[MAXN][MAXN];
void dfs(int u){
	static int cnt;
	id[u]=cnt;
	di[cnt]=u;
	cnt++;
	for(int i=0;i<root[u].size();i++){
		int v=root[u][i];
		dfs(v);
	}
	rt[id[u]]=cnt;
}
int v[MAXN];
int main(){
	int m,n;
	cin>>n>>m;
	int k1,k2;
	for(int i=1;i<=n;i++){
		cin>>k1>>k2;
		v[i]=k2;
		root[k1].push_back(i);
	}
	dfs(0);
	for(int i=n;i>=0;i--){
		** _for(int j=0;j<=m+1;j++)_ **{
			if(j>=1)
				dp[i][j]=max(dp[rt[i]][j],dp[i+1][j-1]+v[di[i]]);
		}
	}
	cout<<dp[0][m+1];
	return 0;
}
是因为数据太水吗?因为按理来说本题循环的时候j这一维是需要j-1推过来的,如果倒序循环应该不可以啊。。。求大佬解答

回复

4 条回复,欢迎继续交流。

正在加载回复...