吃西瓜
- Time Limit: 1s
- Memory Limit: 128.0 MB
Description
ACM暑假集训是一件特别辛苦的事情,聪明的甫神为了给实验室成员创造一个舒适的环境,决定自己出资使实验室成员每天都可以吃到新鲜的西瓜,甫神想让女神找到一个最佳的购买方案,能够使总花费最小,又要保证实验室成员每天都能够吃到新鲜的西瓜。
Input
第一行一个整数T,表示T组数据。(T<=100) 对于每组输入数据: 第一行一个正整数n,表示暑假集训的天数。(0 < n <= 1000) 第二行n个整数a[1],a[2],a[3],a[4]……a[n],其中a[i]表示第i天西瓜的价格。(a[i]<=10^9) 第三行n个整数b[1],b[2],b[3],b[4]……b[n],其中b[i]表示第i天买的西瓜能够维持实验室每天都有西瓜吃的最大天数。(b[i]<=10000)
Output
输出最小的总花费。
Sample Input 1
1 4 10 20 1 40 3 2 3 1
Sample Output 1
11
Note
假设在某天买了西瓜,如果上一次买的西瓜还没有吃完,就会直接丢掉,因为甫神要保证实验室成员吃到的西瓜都是新鲜的。 PS:然而暑假集训并没有1000天这么长~
Source
山东大学2015年ACM新生赛——网络热身赛
由于各种诡异的csdn打不开。。。来我们来写一个关于dp的水题
首先我们要清楚,对于第一天的西瓜是必须买的。
而且对于第一天的西瓜可以维持到的天数最优价格均为第一天的西瓜价格。
假设f[i]记录的是维持i天西瓜的最低价格。
容易得到,f[j]=min(f[j],f[i]+c[i])。
即第j天的价值为之前已更新此天价格与之前价格再加上当天西瓜价格的较小值。
package 卖西瓜;
import java.util.Scanner;
public class Main
{
public static void main(String args[])
{
Scanner s=new Scanner(System.in);
int T=s.nextInt();
for (int I=1;I<=T;I++)
{
int[] c=new int[10000];
int[] d=new int[10000];
int[] f=new int[10000];
int n=s.nextInt();
for (int i=1;i<=n;i++) c[i]=s.nextInt();
for (int i=1;i<=n;i++) d[i]=s.nextInt();
for (int i=1;i<=1000;i++) f[i]=100000;
for (int i=1;i<=d[1];i++) f[i]=c[1];
for (int i=1;i<=n;i++)
{
for (int j=i+1;j<=i+d[i]-1;j++)
{
if (f[j]>f[i]+c[i]) f[j]=f[i]+c[i];
}
}
System.out.println(f[n]);
}
}
}
让我们慢慢攻破动态规划