题目链接:https://nanti.jisuanke.com/t/T3177
蒜头君的花园里有 n 个花盆,每个花盆可以种一株花,现在花椰妹给了蒜头君三种种花的方案
但是花椰妹的每种方案种的都是同一种花,只是形状不同
全部种 A 花,第 i 盆花的价格为 ai
全部种 B 花,第 i 盆花的价格为 bi
全部种 C 花,第 i 盆花的价格为 ci
可是蒜头君觉得整个花园都是同一种花不好看,但是他又不想浪费了花椰妹的好意
所以他决定依旧是按照花椰妹的方案来买花,也就是说第 iii 盆花只有三个选项:ai,bi,ci , 但是他希望相邻的两盆花不是同一种花,
所以他希望你可以帮他计算一下,最少需要花多少钱?
输入格式
第一行只有一个整数 nnn,表示共有 nnn 个花盆。
第二行有 n 个正整数 ai
第三行有 n 个正整数 bi
第四行有 n 个正整数 ci
输出格式
输出仅有一行,该行只有一个整数,表示最小花费。
数据范围
对于 30% 的数据,1≤n≤10
对于 70%的数据,11≤n≤30
对于 100%的数据中,1≤n≤100000,1≤ai,bi,ci≤100
输出时每行末尾的多余空格,不影响答案正确性
样例输入
5 1 3 1 2 2 1 2 3 4 3 4 2 1 5 3样例输出
9
解题思路:
设v[0/1/2]为前 i 盆花第 i盆花买a,b,c三种的情况,那么分别进行状态转移即可,
v[0][i]=min(v[1][i-1],v[2][i-1])+a[i];
v[1][i]=min(v[0][i-1],v[2][i-1])+b[i];
v[2][i]=min(v[0][i-1],v[1][i-1])+c[i];
代码:
#include<iostream> #include<algorithm> using namespace std; int v[5][100005]; int main() { int n,a[100005],b[100005],c[100005],t; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) cin>>b[i]; for(int i=0;i<n;i++) cin>>c[i]; v[0][0]=a[0]; v[1][0]=b[0]; v[2][0]=c[0]; for(int i=1;i<n;i++) { v[0][i]=min(v[1][i-1],v[2][i-1])+a[i]; v[1][i]=min(v[0][i-1],v[2][i-1])+b[i]; v[2][i]=min(v[0][i-1],v[1][i-1])+c[i]; } int sum=min(v[0][n-1],v[1][n-1]); sum=min(sum,v[2][n-1]); cout<<sum<<endl; return 0; }