P1015 公路乘车
时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如样例的第一行就是一个费用的单子。
没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<=100),它可以通过无限次的换车来完成旅程。最后要求费用最少。
没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<=100),它可以通过无限次的换车来完成旅程。最后要求费用最少。
输入格式
第一行十个整数分别表示行走1到10公里的费用(<=500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。
第二行一个整数n表示,旅客的总路程数。
第二行一个整数n表示,旅客的总路程数。
输出格式
仅一个整数表示最少费用。
测试样例1
输入
12 21 31 40 49 58 69 79 90 101
15
输出
147
一开始被误导了,觉得是个完全背包,其实应该是区间DP,
状态转移方程:f[j] = min{f[j], f[j-k] + f[k]} (f[j] != 0);
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
//f[j] = f[j-k] + f[k];
const int N = 110;
#define inf 1<<29
int f[N];
int a[15];
int main()
{
int n;
int i, j, k;
for(i = 1; i <= 10; i++)
{
scanf("%d", &a[i]);
f[i] = a[i];//初始化
}
scanf("%d", &n);
for(j = 1; j <= n; j++)
for(k = 1; k <= j; k++)
{
if(f[j] == 0)
f[j] = f[j-k] + f[k];
else
f[j] = min(f[j], f[j-k] + f[k]);
}
printf("%d", f[n]);
return 0;
}
/*
12 21 31 40 49 58 69 79 90 101
15
-------------------------------
147
*/
反思:
其实也没必要纠结是什么类型的动态规划,我觉得等熟练以后,遇到一道题,觉得这样写对就这样写,随感觉