有一段时间没做了,所以这篇写一下……而且这道题说实在做的有点混乱,所以记录一下。
先上题目: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;
}
要注意的只是一点,我才发现的
连接是单向的