题目描述
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] ( 1<=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
输出
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] ( 1<=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
#include<bits/stdc++.h> using namespace std; #define MAX 1006 int n; int poi[MAX]; int need[MAX]; int ne_poi[MAX]; int dfs(int chat,int have,int id) { //cout<<chat<<' '<<have<<' '<<id<<endl; if(id==n-1) { if(chat>0) return have+poi[n-1]; return have; } if(chat == 0) return have - ne_poi[id]; int a,b = have; if(have >= need[id]) b=dfs(chat,have-need[id],id+1); a=dfs(chat-1,have+poi[id]-need[id],id+1); return max(a,b); } void solve(void) { scanf("%d",&n); for(int i = 0 ; i < n ; i++) scanf("%d",&poi[i]); for(int i = 0 ; i < n-1 ; i++) scanf("%d",&need[i]); if(poi[0] < need[0]) { printf("-1\n"); return ; } ne_poi[n-2] = need[n-2]; for(int i = n - 3 ; i >= 0 ; i--) ne_poi[i] = need[i] + ne_poi[i+1]; int ans; if(need[0]==0) ans = dfs(3,0,0); else ans = dfs(2,poi[0]-need[0],1); if(ans<0) puts("-1"); else printf("%d\n",ans); } int main() { solve(); return 0; }