zoukankan      html  css  js  c++  java
  • DP基础_矩阵连乘

    DP基础_矩阵连乘
    Description

    矩阵乘法是线性代数中最基础的一个知识点,设矩阵A为一个n行m列的矩阵,矩阵B为x行y列,那么A能乘B的条件为m = x,它们相乘将得出一个n行y列的矩阵,进行一次矩阵乘法的运算次数为n×m×y,现在给出k个矩阵,你每次可以合并相邻的两个矩阵,将它们做乘法得出的矩阵作为合并的结果,请问如何合并能使得总的运算次数最少。

    Input
    第一行一个数k(k≤100)。

    接下来k行,每行两个正整数表示该矩阵的行和列(每个数≤50)。

    Output
    一个整数表示最少的合并代价。

    Sample Input 1

    3
    1 5
    5 20
    20 1
    Sample Output 1

    105

    思路:
    基本区间dp板子,区间dp掌握--

    代码:(有点小问题,题目要求是相邻的矩阵才可以合并,所以不需要复制一遍)

    #include<bits/stdc++.h>
    using namespace std;
    
    struct node{
    	long long x,y;
    }a[1020];
    long long n,f[1020][1020];
    
    int main()
    {
    	memset(f,0x3f,sizeof(f));
    	cin>>n;
    	for(int i=1;i<=n;i++) 
    	{
    		cin>>a[i].x >>a[i].y ;
    		a[i+n].x =a[i].x ;
    		a[i+n].y =a[i].y ;
    	}
    	
    	for(int i=n;i>=1;i--) f[i][i]=0;
    		
    	for(int l=2;l<=n;l++)
    		for(int i=1;i<=2*n-l+1;i++)
    		{
    			int j=i+l-1;
    			for(int k=i;k<j;k++)
    			{
    				if(a[k].y ==a[k+1].x )
    				{
    					f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+a[i].x *a[k].y *a[j].y );
    //					if(f[i][j]>f[i][k]+f[k+1][j]+a[i].x *a[k].y *a[k].y)
    //					cout<<i<<" "<<j<<" "<<k<<'
    ';
    //					cout<<f[i][j]<<" "; 
    				}
    			}
    		}
    		
    	long long ans=99999;
    	for(int i=1;i<=n;i++)
    	{
    		ans=min(f[1][i+n-1],ans);
    	}
    	
    	cout<<ans<<'
    ';
    	return 0;
    	
    	
    	return 0;
    }
    
  • 相关阅读:
    Beta阶段代码规范与计划
    Alpha总结展望——前事不忘后事之师
    Alpha冲刺成果测试
    Alpha冲刺总结
    码到成功——Beta冲刺随笔 day 5
    码到成功——Beta冲刺随笔 day 4
    码到成功——Beta冲刺随笔 day 3
    码到成功——Beta冲刺随笔 day 2
    码到成功——Beta冲刺随笔 day 1
    项目Beta冲刺(团队)——凡事预则立
  • 原文地址:https://www.cnblogs.com/yxr001002/p/14432958.html
Copyright © 2011-2022 走看看