HDU4283(区间DP)
2015-10-24 13:50
288 查看
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> using namespace std; #define maxn 111 #define maxm 8111111 #define INF 11111111111 long long dp[maxn][maxn], f[maxn][maxn]; int n; long long a[maxn]; long long sum[maxn]; int main () { //freopen ("in", "r", stdin); int t, kase = 0; scanf ("%d", &t); while (t--) { scanf ("%d", &n); sum[0] = 0; for (int i = 1; i <= n; i++) scanf ("%lld", &a[i]); for (int i = 1; i <= n; i++) sum[i] = sum[i-1]+a[i]; memset (f, 0, sizeof f); for (int i = n; i >= 1; i--) { for (int j = i; j <= n; j++) { f[i][j] = f[i+1][j]+a[i]*(j-i); } } for (int i = 0; i <= n+1; i++) { for (int j = 0; j <= n+1; j++) { dp[i][j] = INF; } } for (int i = 1; i <= n; i++) dp[i][i] = 0; for (int l = 1; l <= n; l++) { for (int i = 1; i+l <= n; i++) { for (int j = i; j+1 <= i+l; j++) { int cnt1 = j-i+1, cnt2 = i+l-j; int sum1 = sum[j]-sum[i-1], sum2 = sum[i+l]-sum[j]; dp[i][i+l] = min (dp[i][i+l], min (dp[i][j]+dp[j+1][i+l]+sum2*cnt1, dp[j+1][i+l]+f[i][j]+sum1*cnt2)); } } } printf ("Case #%d: %lld\n", ++kase, dp[1] ); } return 0; }
相关文章推荐
- LeetCodeOJ_205_Submission Details
- HDU——2011 多项式求和
- PowerDesigner之业务流程模型
- poj2396有上下限网络流
- 使用IronPython给.Net程序加点料
- SOLR对多个(关联)表创建索引
- Contains Duplicate II - LeetCode
- 使用OC swift 截取路径中的最后的文件名
- Gson简要使用笔记
- Java中的泛型方法
- Java程序员们最常犯的10个错误
- ubuntu搭建git server
- C# 编写简单的控制台应用程序 显示如下数字金字塔
- 信息安全系统设计基础第7周学习总结
- 凸包 graham旋转扫描
- iPhone屏幕投射到Mac的解决方案
- leetcode 104 Maximum Depth of Binary Tree
- iOS7.0隐藏状态栏(statusBarHidden)
- java编程的78条黄金法则
- .gradle 文件简单介绍