Cod sursa(job #3291365)

Utilizator rainerretzler rainer Data 4 aprilie 2025 14:56:29
Problema Parantezare optima de matrici Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<iostream>
#include<fstream>

using namespace std;

int dims[1000];
int dp[1000][1000];

int getC(int i){
	return dims[i+1];
}

int getR(int i){
	return dims[i];
}

int din(int n){
	for(int i=1;i<=n;i++){
		dp[i][i]=0;
		dp[i][i+1]=getR(i)*getC(i)*getC(i+1);
	}
	for(int lungimeInterval=3;lungimeInterval<=n;lungimeInterval++){
		int stopInterval=lungimeInterval;
		for(int startInterval=1;stopInterval<=n;startInterval++,stopInterval++){
			int inm=getR(startInterval)*getC(stopInterval);
			dp[startInterval][stopInterval]=dp[startInterval+1][stopInterval]+inm*getC(startInterval);
			for(int k=startInterval+1;k<stopInterval;k++){
				int x=dp[startInterval][k]+dp[k+1][stopInterval]+inm*getC(k);
				dp[startInterval][stopInterval]=min(dp[startInterval][stopInterval],x);
			}
		}
	}
	// for(int i=1;i<=n;i++){
	// 	for(int j=i;j<=n;j++){
	// 		cout<<i<<" "<<j<<" "<<dp[i][j]<<"\n";
	// 	}
	// }
	return dp[1][n];
}

int main(){
	ifstream fin("podm.in");
	ofstream fout("podm.out");
	int n;
	fin>>n;
	for(int i=1;i<=n+1;i++){
		fin>>dims[i];
	}
	// cout<<"gata\n";
	// cout.flush();
	fout<<din(n);
	fin.close();
	fout.close();
	return 0;
}