UESTC 1131 男神的礼物 dp:最优矩阵链乘&&triangulation&&双dp
2016-02-28 16:55
429 查看
男神的礼物
Time Limit: 3000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Submit
Status
Lweb学长是集训队里公认的男神。有一天他要给美美的学姐姐准备礼物。
Lweb学长可是会魔法的哟。为了准备一份礼物,男神要加工n份材料。每一次只能加工相邻的材料。
当男神加工两个魔法值为a,b的材料,男神都要消耗a*b的体力,同时在这个地方合成出魔法值(a+b)%100的材料。
男神为了能节省体力来完成他的礼物。想找聪明的你帮他算一算他所要花费的最小体力。
Input
第一行一个整数T,表示男神所要准备的礼物数。 之后的T组数据各有两行数据,第一行有一个整数n,表示这份礼物的材料数(1<=n<=100)。 接下来一行有n个整数a(0<=a<100),表示这件礼物第i份材料的魔法值。
Output
每组数据一行输出,表示男神***这份礼物所要的最小体力。
Sample input and output
Sample Input | Sample Output |
---|---|
2 2 18 19 3 40 60 20 | 342 2400 |
Hint
对于样例 2:先加工材料40和60,得到0的材料,消耗40∗60体力,共消耗2400体力;
再加工材料0和20,得到20的材料,消耗0∗20体力,共消耗2400体力.
Source
2015 UESTC Training for Dynamic Programming
My Solution
这是一个经典的最优矩阵链乘问题,只不过单个费用会改变,像是2个dp搞在一起,是把单个的min换成if语句就好状态:dp[ i ][ j ]为最小费用
da[ i ][ j ]为相应新的代价
转移方程:
dp[ i ][ j ] = min( dp[ i ][ j ] , da[ i ][ k ]*da[ k+1 ][ j ] + dp[ i ][ k ]+dp[ k+1 ][ j ];
然后根据取到情况刷新 da[ i ][ j ],{如果遇到,上面两值相等则取min{ da[ i ][ j ] }
边界:
da[i-1][i] = (a[i-1] + a[i]) % 100;
dp[i-1][i] = a[i-1]*a[i];
da[i][i] = a[i];
dp[i][i] = 0;
#include <iostream> #include <cstdio> //#define LOCAL using namespace std; const int INF = 0x3f3f3f3f; int dp[104][104],a[104],da[104][104]; int main() { #ifdef LOCAL freopen("a.txt","r",stdin); #endif // LOCAL int T,n; scanf("%d", &T); while(T--){ scanf("%d", &n); a[0] = 1; for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); da[i-1][i] = (a[i-1] + a[i]) % 100; dp[i-1][i] = a[i-1]*a[i]; da[i][i] = a[i]; dp[i][i] = 0; } for(int i = n-1; i >= 1; i--){ for(int j = i+1; j <= n; j++){ //前面这里少了个 = 为 j <= n 而不是 < if(i+1 != j)dp[i][j] = INF; for(int k = i; k < j; k++){ int &a = dp[i][j], b = da[i][k] * da[k+1][j]+dp[i][k]+dp[k+1][j]; if(a > b){ a = b; da[i][j] =(da[i][k]+da[k+1][j])%100; } if(a == b) da[i][j] = min(da[i][j], (da[i][k]+da[k+1][j])%100); //dp[i][j] = min(dp[i][j], da[i][k] * da[k+1][j]+dp[i][k]+dp[k+1][j]); } } } printf("%d\n",dp[1] ); } return 0; }
Thank you!
相关文章推荐
- 6.UiWatcher API 详细介绍
- Android系统Bluetooh移植简要说明
- 5.UiScrollable API 详细介绍
- String,StringBuffer与StringBuilder的区别??
- POJ 2313 Sequence#贪心
- IOS UI-瀑布流(UICollectionView)
- Fluently NHibernate映射多个实体程序集
- Fluently NHibernate映射多个实体程序集
- IOS 自动化 2-UI Automation-功能测试
- IOS 自动化 1-UI Automation
- 4.UiCollection API 详细介绍
- UVa 1584 - Circular Sequence
- UIKit框架(3)UIView的动画处理方式
- Android测试系列之Instrumented Unit Test-UiAutomator
- UIKit框架(2)框架简介
- 1099. Build A Binary Search Tree (30)
- getRequestDispatcher()与sendRedirect()的区别
- LeetCode题解:Range Sum Query - Immutable
- 一个高效的UI才是一个拉风的UI(二)
- 一个高效的UI才是一个拉风的UI(一)