因为长时间没有练习,动态规划忘得差不多了,事后再拾一下动态规划。
原题为:
3*n的矩阵a,将每列的三个数字中取出一个按顺序组成一个长度为n的数组b,问的最小值。输入:
5
5 9 5 4 4
4 7 4 10 3
2 10 9 2 3
输出:
5
通过动态规划,代码如下
#include <iostream>
#include <cmath>
#include<cstdlib>
#include<limits.h>
using namespace std;
int a[3][100000];
int dp[3][100000];//记录当前状态的最值
int main()
{
int n;
cin>>n;
for(int i=0;i<3;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
for(int j=1;j<n;j++)//j为列数,从1开始,dp[k][0]=0;
{
for(int i=0;i<3;i++)
{
dp[i][j]=INT_MAX;
for(int k=0;k<3;k++)
{//状态转移方程
dp[i][j]=min(dp[k][j-1]+abs(a[i][j]-a[k][j-1]),dp[i][j]);
}
}
}
int min1=INT_MAX;
for(int i=0;i<3;i++)
{
min1=min(min1,dp[i][n-1]);
}
cout<<min1;
return 0;
}