“明明说好的已弃ACM了么?”
“然而看到水题根本控制不住双手T^T…正好c语言考试马上要来了, 没事刷刷水题”
tyvj是不兹词Chrome了么..登录不上, 于是手动评测(AC滑稽脸), 发现AC不了的话千万不要来找我(逃)
题目
http://www.tyvj.cn/p/1014
水题(龟速 + 龟量) ++;
这题一开始写错了, 后来改了一遍才对, PIA~
大雾实验今天做的是欲仙欲死…时间不够用了, 刷不了四题, 就刷这一题吧, 不然没时间复习别的了(J_J)
题解
1014
注释里面就是我最开始的代码, 有错误, 错误肯定是在初始化那个地方, 这里偏偏要求最小..自然而然用函数重写了一遍才写对
正常DP, 转移方程: f[i][j] = min(f[i][j], f[i][k] + f[k][j] + 三个数据相乘), 也很容易理解咯, 和Floyd一模一样
答案:
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
int d[105];
int f[105][105];
//f[i][j] = min(f[i][j], f[i][k] + f[k][j] + d[i]*d[k]*d[j])
int i, j;
int g(int l, int r){
if(!(r - l - 1)) return 0;
if(f[l][r] < 100000000) return f[l][r];
for(int k = l + 1; k < r; ++k)
f[l][r] = min(f[l][r], g(l, k) + g(k, r) + d[l] * d[r] * d[k]);
return f[l][r];
}
int main()
{
memset(f, 127, sizeof(f));
scanf("%d", &n);
for(i = 1; i <= n; ++i)
scanf("%d", &d[i]);
// for(i = 1; i < n; ++i)
// for(j = i + 1; j <= n; ++j)
// for(k = i + 1; k < j; ++k){
// if(!f[i][j]) {f[i][j] = f[i][k] + f[k][j] + d[i] * d[k] * d[j]; continue;}
// f[i][j] = min(f[i][j], f[i][k] + f[k][j] + d[i] * d[k] * d[j]);
// }
printf("%d\n", g(1, n));
return 0;
}