纯美之袍
题目链接: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;
}

浙公网安备 33010602011771号