有一段时间没做了,所以这篇写一下……而且这道题说实在做的有点混乱,所以记录一下。

先上题目:https://www.luogu.com.cn/problem/P2196

然后是我的代码(是按照某题解的思路来的):

#include<iostream>
using namespace std;
const int N=27;
int n,bst,ans;
int a[N],dp[N],frt[N];
bool lk[N][N];
void input(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n-1;i++){
		for(int j=i+1;j<=n;j++){
			cin>>lk[i][j];
		}
	}
}
void dpfun(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			if(lk[j][i]&&dp[j]>dp[i]){
				dp[i]=dp[j]; frt[i]=j;
			}
		}
		dp[i]+=a[i];
		if(dp[i]>bst) ans=i;
		bst=max(bst,dp[i]);
	}
}
void prt(int x){
	if(frt[x]==0){
		cout<<x<<' '; return;
	}
	prt(frt[x]);
	cout<<x<<' ';
	return;
}
void output(){
	prt(ans);
	cout<<'\n'<<bst;
}
int main(){
	input();
	dpfun();
	output();
	return 0;
}

要注意的只是一点,我才发现的

连接是单向的