很多人说这道题是有向图,而是只能从大到小走,但我按照无向图dp也过了,为什么
查看原帖
很多人说这道题是有向图,而是只能从大到小走,但我按照无向图dp也过了,为什么
709586
lllllluogu楼主2024/3/24 18:13
#include <bits/stdc++.h>//设置f[i]表示i结尾的最大值
using namespace std;
int ans,n,a[30][30],w[30],f[30],pre[30];
void print(int x){
	if(pre[x]==0){cout<<x<<" ";return ;}
	print(pre[x]);
	cout<<x<<" ";
}
int main(){
	cin>>n;int s;
	for(int i=1;i<=n;i++)cin>>w[i];
	for(int i=1;i<=n-1;i++)
	for(int j=i+1;j<=n;j++){
		cin>>a[i][j];
		a[j][i]=a[i][j]; //这句如果不加就过不了,但是这道题好多人说是有向图,我是真的不理解
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]&&f[j]>f[i]){//这妥妥的按照无向图dp的呀
				f[i]=f[j];pre[i]=j;
			}
		}
		f[i]+=w[i];
		if(f[i]>ans){ans=f[i];s=i;}
	}
	print(s);cout<<'\n';
	cout<<ans;
	return 0;
}

2024/3/24 18:13
加载中...