POJ1651Multiplication Puzzle(区间DP)
2024-08-28 20:39:16
比较好做的区间DP
状态转移方程:DP[i][j] 表示区间[i,j]最小的乘积和。
DP[i][j] = MIN{DP[i][k-1]+DP[k+1][j] + a[k]*a[i-1]*a[j+1] | i<k<j};
最后结果就是DP[2][N-1]
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define eps 1e-15
#define MAXN 105
#define INF 1000000007
#define MAX(a,b) (a > b ? a : b)
#define MIN(a,b) (a < b ? a : b)
#define mem(a) memset(a,0,sizeof(a)) int a[],DP[][],N; int main()
{
while(~scanf("%d", &N))
{
for(int i=;i<=N;i++)
{
for(int j=;j<=N;j++) DP[i][j] = INF;
}
for(int i=;i<=N;i++)
{
scanf("%d", &a[i]);
}
for(int i=;i<N;i++)
{
for(int j=i;j>=;j--)
{
if(i == j) DP[j][i] = a[i] * a[i-] * a[i+];
else
{
int x = DP[j+][i]+a[j]*a[j-]*a[i+];
int y = DP[j][i-]+a[i]*a[j-]*a[i+];
DP[j][i] = MIN(x, y);
if(i-j>)for(int k = j+;k<i;k++)
{
x = DP[j][k-] + DP[k+][i] + a[k]*a[j-]*a[i+];
DP[j][i] = MIN(DP[j][i], x);
}
}
}
}
printf("%d\n", DP[][N-]);
}
return ;
}
最新文章
- 读取TDrawGrid之获取博易数据
- System.BadImageFormatException: 未能加载文件或程序集";";或它的某一个依赖项。试图加载格式不正确的程序。
- C++之路进阶——bzoj2879(美食节)
- ztree
- [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇&#183;基于C#上位机软件开发
- 【jQuery Demo】jQuery打造动态下滑菜单
- WP8.1 Study12:文件压缩与Known Folder(包含SD卡操作)
- 浅谈Dynamic 关键字系列之一:dynamic 就是Object(转)
- JSON 之 SuperObject(8): 关于乱码的几种情况 - 向 Henri Gourvest 大师报告
- 一种Webconfig自动化升级方法
- Scala基础之注解(annotation
- JavaScript入门学习笔记(JSON)
- liunx centOS6.5安装jdk教程
- iScroll的使用
- Distances to Zero CodeForces - 803B (二分)
- ElasticSearch 索引整体迁移方案
- 《深入理解JAVA虚拟机》----------第三章 垃圾收集器与内存分配策略,笔记(下)
- Java虚拟机--虚拟机字节码执行引擎
- C语言--第三次作业
- 说说PHP中的命名空间相关概念