首先模拟过程,发现它是一个动态规划类型的问题,再使用全排列将所有情况列出即可写出代码
#include <cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=1e3;
int a[N],b[N];
int c[N][N];//存放全排列结果
int arr[N][N];//存放原始数据
int sign[N][N];//存放修改过的数据
int n,p=1,res=1e6;
void dfs(int i){
if(i>=n+1){
for(int k=1;k<=n;k++){
c[p][k]=a[k];
}
p++;
return ;
}
else{
for(int j=1;j<=n;j++){
if(!b[j]){
b[j]=1;
a[i]=j;
dfs(i+1);
b[j]=0;
}
}
}
}
int main(){
// freopen("D:\\YJ.txt","r",stdin)
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=3;j++){
cin>>arr[i][j];
}
}
dfs(1);//全排列
for(int k=1;k<p;k++){
for(int i=1;i<=4;i++){
for(int j=1;j<=3;j++){
sign[c[k][i]][j]=max(sign[c[k][i-1]][j],sign[c[k][i]][j-1])+arr[c[k][i]][j];//max的意思是取两个值中的最大值
// cout<<sign[c[k][i]][j]<<" ";//测试使用
}
cout<<endl;
}
res=min(res,sign[c[k][n]][3]);//取两个值中的最小值
memset(sign,0,sizeof(sign));//初始化sign数组
}
cout<<res;
return 0;
}
数学建模概论的题目,使用c++实现了一下