从1开始dp和起点是1
查看原帖
从1开始dp和起点是1
803885
_8008008楼主2023/8/25 21:47

看了这个帖子后,我把我代码里的rd(1)改成了for(int i=1;i<=n;i++)rd(i)AC了,可我原本是想写从1开始dp,是哪里错了吗

#include<iostream>
#define N 10000
int n,qz[N],ans[N];bool map[N][N],ans2[N];
bool no(int x){
	for(int i=x+1;i<=n;i++)if(map[x][i])return false;
	return true;
}
int max(int x,int y){
	if(x>y)return x;
	else return y;
}
int rd(int x){
	if(no(x)){
		ans[x]=qz[x],ans2[N]=true;
		return qz[x];
	}
	int maxx=-1; 
	for(int i=x+1;i<=n;i++){
		if(map[x][i]){
			if(ans2[i])maxx=max(maxx,ans[i]);
			else maxx=max(maxx,rd(i));
		}
	}
	maxx+=qz[x];
	ans[x]=maxx,ans2[N]=true;
	return maxx;
}
void output(int x){
	int maxx=-1,maxy;bool flag=true;
	for(int i=x;i<=n;i++)
		if(maxx<ans[i]&&map[x][i])
			maxy=i,maxx=ans[i],flag=false;
	if(flag)return;
	printf("%d ",maxy);
	output(maxy);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&qz[i]);
	for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)scanf("%d",&map[i][j]);
	for(int i=1;i<=n;i++)rd(i);//原来是rd(1)
	int maxx=-1,maxy;
	for(int i=1;i<=n;i++)if(maxx<ans[i])maxy=i,maxx=ans[i];
	printf("%d ",maxy);
	output(maxy);
	printf("\n%d",maxx);
	return 0;
} 
``
2023/8/25 21:47
加载中...