NC15891. iko和她的糖
描述
iko超级超级喜欢吃糖,有一天iko想出去玩,她计划从1点走到N点(按1,2,3,...,n的顺序走),每个点都有一个补给站,第i点的补给站有a[i]颗糖,从i点走到i+1点会消耗掉b[i]颗糖,iko在出游的途中可以选择三个补给站,iko想知道她走完全程到达N点时口袋里最多还能剩下几颗糖(初始时iko的口袋里一颗糖都没有)。
输入描述
第一行输入N(3<=N<=1000)
第二行输入N个数代表a[1].......a[N] (0<=a[i]<=1000 )
第三行输入N-1个数代表b[1]......b[N-1] ( 0<=b[i]<=1000 )
输出描述
输出一个数字表示iko到达n点时口袋里最多剩下的糖,
若不能到达N点输出-1。
示例1
输入:
3 1 3 4 3 4
输出:
-1
示例2
输入:
5 3 4 5 2 4 3 2 2 2
输出:
3
C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 480K, 提交时间: 2020-09-28 20:38:39
#include<bits/stdc++.h> using namespace std; const int maxn=1e3+5; int n,max_=-1,a[maxn],b[maxn]; void dfs(int sum,int pos,int ways){ if(sum<0||ways<0){ return; } if(pos==n){ if(ways>0)max_=max(max_,sum+a[n]); else max_=max(max_,sum); return; } dfs(sum+a[pos]-b[pos],pos+1,ways-1); dfs(sum-b[pos],pos+1,ways); } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<n;i++)cin>>b[i]; dfs(0,1,3); cout<<max_<<endl; }
Python3 解法, 执行用时: 43ms, 内存消耗: 4728K, 提交时间: 2022-01-24 17:59:49
m=-1 n=int(input()) a=[] a.append(0) a1=input().split() for i in range(n): a.append(int(a1[i])) b=[] b.append(0) b1=input().split() for i in range(n-1): b.append(int(b1[i])) def dfs(x,y,s): global m if x==n: if y<3: s=s+a[x] m=max(m,s) return if s>=b[x]: dfs(x+1,y,s-b[x]) if s+a[x]>=b[x] and y+1<=3: dfs(x+1,y+1,s+a[x]-b[x]) dfs(1,0,0) print(m)
C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2023-07-02 16:53:34
#include<bits/stdc++.h> using namespace std; int a[1005],b[1005],n; int sum=0,flag=0,mx=-1; void dfs(int x,int y,int sum) { if(sum<0) { return; } if(x>n) { mx=max(mx,sum); return; } if(y) dfs(x+1,y-1,sum+a[x]-b[x]); dfs(x+1,y,sum-b[x]); } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<n;i++) cin>>b[i]; dfs(1,3,0); cout<<mx<<endl; }