买票

赤壁(下)终于在宁波上映了,那票房真是异常火爆啊,那简直是一票难求。小明兴冲冲跑到了“XX电影院”(为避免做广告的嫌疑,影院名字打马赛克,现广告位招租,价格优惠,欢迎各大影院来电咨询)门口。发现已经有n个影迷排队买票,一个人买一张,而售票处规定,一个人每次最多只能买两张票。假设第i位影迷买一张票需要时间Ti(1≤i≤n),队伍中相邻的两位影迷(第j个人和第j+1个人)也可以由其中一个人买两张票,而另一位就可以不用排队了,则这两位影迷买两张票的时间变为Rj,假如Rj

人太多了。。小明排在这n个人后面,真是那个烧心啊,小明又不喜欢和前面的人一起买票,那只有这n个人都买到票后才能轮到小明买票。可小名想早点买到票,现给出n, Tj和Rj,你帮小明计算一下最快多久能轮到他买票?

Input

有多组数据,每组包含3行:第一行一个整数n(1<=n<=5000);第二行n个整数,表示Ti(1≤i≤n,0<=Ti<=65535)
相邻两个数之间有一个空格隔开;第三行n-1个整数,表示Ri(1≤i≤n-1,0<=Ri<=65535)相邻两个数之间有一个空格隔开。

Output

每组输入对应一组输出,每一组输出只有一行一个整数k,表示n个人买完票最快需要多少时间。

Sample Input

3
1 2 3
1 1
4
1 2 3 4
2 3 10

Sample Output

2
8
#include
using namespace std;
int i,i0,n,m,T,a[5005],r[5005];
long long dp[5005];
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)scanf("%d",&a[i]),dp[i]=(long long)n*INT_MAX;
        for(i=1;i<n;i++)scanf("%d",&r[i]);
        for(i=1;i<=n;i++)
        {
            dp[i]=min(dp[i],dp[i-1]+a[i]);
            if(i>1)dp[i]=min(dp[i],dp[i-2]+r[i-1]);
        }
        printf("%lld\n",dp[n]);
    }
    return 0;
}

你可能感兴趣的:(数据结构与算法)