区间DP——Dire Wolf ( HDU 5115 )
来源:互联网 发布:java所有关键字 编辑:程序博客网 时间:2024/05/16 04:45
题目链接:
http://acm.split.hdu.edu.cn/showproblem.php?pid=5115参考链接:
http://blog.csdn.net/hurmishine/article/details/50198967分析:
给出N头狼的攻击力和辅助攻击力,每头狼的攻击力等于它本身的攻击力加上它左右的狼的辅助攻击力,求出如何移走狼才能使得受到最小的攻击。题解:
区间DP:
区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合 ,求合并后的最优值。
最小区间F[i,i]=0(一个数字无法合并,∴代价为0)
每次用变量k(i<=k<=j-1)将区间分为[i,k]和[k+1,j]两段
For p:=1 to n do // p是区间长度,作为阶段。
for i:=1 to n do // i是穷举的区间的起点
begin
j:=i+p-1; // j是 区间的终点,这样所有的区间就穷举完毕
if j>n then break; // 这个if很关键。
for k:= i to j-1 do // 状态转移,去推出 f[i,j]
f[i , j]= max{f[ i,k]+ f[k+1,j]+ w[i,j] }
end;
这个结构必须记好,这是区间动态规划的代码结构。DP 代码:
void solve(){ int s, e, len, mid; for(len = 0; len<=N; len++) //区间长度 { for(s=1; s<N+1-len; s++) //区间起点 { e = s + len; //区间终点 for(mid=s; mid<=e; mid++) //中间点 { if(dp[s][mid-1]+dp[mid+1][e]+a[mid]+b[s-1]+b[e+1] < dp[s][e] ) { dp[s][e] = dp[s][mid-1] + dp[mid+1][e] + a[mid] + b[s-1] + b[e+1]; } } } }}
- 参考代码:
/************************************************************************* > File Name: DireWolfHDU5115.cpp > Author: Akira > Mail: qaq.febr2.qaq@gmail.com > Created Time: 2016年08月25日 星期四 20时57分29秒 ************************************************************************/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cmath>#include <vector>#include <set>#include <list>#include <ctime>typedef long long LL;typedef unsigned long long ULL;typedef long double LD;#define MST(a,b) memset(a,b,sizeof(a))#define CLR(a) MST(a,0)#define Sqr(a) ((a)*(a))using namespace std;#define MaxN 100000#define MaxM MaxN*10#define INF 1000000000#define bug cout<<88888888<<endl;int dp[233][233];int a[233];int b[233];int N;void solve(){ int s, e, len, mid; for(len = 0; len<=N; len++) //区间长度 { for(s=1; s<N+1-len; s++) //区间起点 { e = s + len; //区间终点 for(mid=s; mid<=e; mid++) //中间点 { if(dp[s][mid-1]+dp[mid+1][e]+a[mid]+b[s-1]+b[e+1] < dp[s][e] ) { dp[s][e] = dp[s][mid-1] + dp[mid+1][e] + a[mid] + b[s-1] + b[e+1]; } } } }}int main(){ int t; scanf("%d", &t); int tt = 1; while(t--) { memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%d", &N); for(int i=1; i<=N; i++) { scanf("%d", &a[i]); } for(int i=1; i<=N; i++) { scanf("%d", &b[i]); } for(int i=1;i<=N;i++) { for(int j=i;j<=N;j++) { dp[i][j] = 99999999; } } solve(); printf("Case #%d: %d\n",tt++,dp[1][N]); }}
0 0
- 区间DP——Dire Wolf ( HDU 5115 )
- 【DP】 HDU 5115 Dire Wolf 区间DP
- hdu 5115 Dire Wolf 区间DP
- hdu 5115 Dire Wolf (区间DP)
- HDU 5115 Dire Wolf (区间DP)
- hdu 5115 Dire Wolf(区间DP)
- HDU 5115Dire Wolf(区间dp)
- hdu 5115 Dire Wolf【区间DP】
- HDU 5115 Dire Wolf(区间DP)
- HDU 5115 Dire Wolf (区间dp)
- HDU 5115 Dire Wolf(区间DP)
- HDU 5115 Dire Wolf(区间DP)
- HDU - 5115 Dire Wolf(区间DP)
- HDU 5115 Dire Wolf(区间DP)
- hdu 5115 Dire Wolf(区间dp)
- HDU 5115:Dire Wolf 区间dp
- HDU 5115 Dire Wolf(区间DP)
- hdu 5115 Dire Wolf【区间dp】
- 60. Permutation Sequence(难)
- 关于Jsoup的一些认识
- 中断之中断向量表IDT的初始化
- 【lightoj1307】Counting Triangles
- GreenDao的使用
- 区间DP——Dire Wolf ( HDU 5115 )
- NYOJ 1170 最大的数(待续)
- mysql 数据库的事务隔离级别及mysql 索引优化
- matlab:从参考二维矩阵中选择出指定的元素
- Splay总结
- ACM学习历程16——List链表的应用之简单约瑟夫问题
- Thrift应用:Windows下C#服务端实现
- SpringMVC不经过Controller直接响应页面
- Git学习总结