纯美之袍

题目链接:http://10.160.111.129/p/2632?tid=67e4e2b24bb5492401615f3a

题意:

开始任选一个格子,只能从前往后走,遇到传送门可以花费现有水晶的一半传送,求最后最多的水晶数

思路:

显然最后一个格子是由前面的格子转移得到,所以一维dp
每次遇到一个格子,它有可能是由传送门转移得到,也有可能是从上一个格子跳到

因此每次转移时都要和其本身值来比较

dp初始化为数组值,(但其实全0也能过,还久内个水数据

比赛时没搞清楚传说门好像可以往前传,因此前缀和优化令人忍俊不禁

没事搞个蛋的优化

int ans;
void solve(){
	int n;cin>>n;
	vector<int>a(n+1);
	vector<int>b(n+1);
	vector<int>dp(n+2,0);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		dp[i]=a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	for(int i=1;i<=n;i++){
		dp[i]=max(dp[i],dp[i-1]+a[i]);
		if(b[i]>0){
			dp[b[i]]=max(dp[b[i]],dp[i]/2+a[b[i]]);
		}
		ans=max(dp[i],ans);
	}
	cout<<ans<<endl;
}
posted @ 2025-03-28 21:10  Marinaco  阅读(23)  评论(0)    收藏  举报
//雪花飘落效果