2015 UESTC Training for Dynamic Programming 男神的礼物(区间dp)
2017-08-10 10:29
459 查看
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
Sample Output
Hint
对于样例 2:
先加工材料40和60,得到0的材料,消耗40∗∗60体力,共消耗2400体力;
再加工材料0和20,得到20的材料,消耗0∗∗20体力,共消耗2400体力.
【题解】
分析:区间dp,转移方程:dp[i][j]=min(dp[i][j] , dp[i][l]+dp[l+1][j]+((sum[l]-sum[i-1])%100)*((sum[j]-sum[l])%100));
【AC代码】
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
2 2 18 19 3 40 60 20
Sample Output
342 2400
Hint
对于样例 2:
先加工材料40和60,得到0的材料,消耗40∗∗60体力,共消耗2400体力;
再加工材料0和20,得到20的材料,消耗0∗∗20体力,共消耗2400体力.
【题解】
分析:区间dp,转移方程:dp[i][j]=min(dp[i][j] , dp[i][l]+dp[l+1][j]+((sum[l]-sum[i-1])%100)*((sum[j]-sum[l])%100));
【AC代码】
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int N=200; const int inf=1e9; int m,n; int dp ; int a ; int sum ; int solve(int i,int j) { if(dp[i][j]>=0) return dp[i][j]; else if(i==j-1) return dp[i][j]=a[i]*a[j]; else if(i==j) return 0; else { dp[i][j]=inf; for(int l=i;l<=j;l++) { dp[i][j]=min(dp[i][j],solve(i,l)+solve(l+1,j)+((sum[l]-sum[i-1])%100)*((sum[j]-sum[l])%100)); } } return dp[i][j]; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&m); sum[0]=0; memset(dp,-1,sizeof(dp)); for(int i=1;i<=m;++i){ scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } printf("%d\n",solve(1,m)); } return 0; }
相关文章推荐
- 2015 UESTC Training for Dynamic Programming A- 男神的礼物(区间dp)
- 2015 UESTC Training for Dynamic Programming 男神的约会 BFS+状压DP
- UESTC_男神的礼物 2015 UESTC Training for Dynamic Programming<Problem A>
- 2015 UESTC Training for Dynamic Programming J - 男神的约会(bfs)
- 2015 UESTC Training for Dynamic Programming H - 邱老师选妹子(数位dp)
- UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>
- 2015 UESTC Training for Dynamic Programming N - 导弹拦截 LIS nlog(n)+打印字典序最小的路径
- 2016 UESTC Training for Dynamic Programming L - 柱爷抢银行MkⅣ dp 线段树优化
- UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<Problem L>
- UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>
- UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>
- UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>
- UESTC_秋实大哥掰手指 2015 UESTC Training for Dynamic Programming<Problem B>
- UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>
- 2016 UESTC Training for Dynamic Programming B - 柱爷与最大区间和 最大区间和推广、前缀和、枚举间隔点
- UESTC_最少花费 2015 UESTC Training for Dynamic Programming<Problem D>
- UESTC_菲波拉契数制 2015 UESTC Training for Dynamic Programming<Problem E>
- 2016 UESTC Training for Dynamic Programming D - 柱爷的恋爱 区间dp、记忆化搜索
- UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>
- UESTC 2015dp专题 A 男神的礼物 区间dp