HDU 5115 Dire Wolf(2014ACM/ICPC北京赛区现场赛D)
2015-09-02 20:31
447 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115
9.2日组队训练的时候并没有想到是DP,第一眼看过去觉得可能是贪心,因为卡在了计算几何上,并且还有B这道搜索可以开,所以并没有充分的时间来思考这道题目。一道中规中矩的区间型DP题目。
【参考代码】
9.2日组队训练的时候并没有想到是DP,第一眼看过去觉得可能是贪心,因为卡在了计算几何上,并且还有B这道搜索可以开,所以并没有充分的时间来思考这道题目。一道中规中矩的区间型DP题目。
设DP[i][j]表示杀死区间i~j之间的狼所需要花费的最小代价。 该状态由上一个状态转移而来,所以只需要枚举最后一只被杀死的狼来更新dp值即可。 DP[i][j] =min( dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1] ) (k=[i..j]) 需要注意的是初始化赋值。另外,没有搞明白dp值上界,保险起见开了long long 来存储。
【参考代码】
#include<cstdio> #include<iostream> #include<stack> #include<algorithm> #include<cmath> #include<cstring> using namespace std; long long INF=(long long)1000000000000; int n; long long dp[200+10][200+10]; int a[200+10],b[200+10]; long long dfs( int l, int r ) { if(l>r)return 0; if(dp[l][r]!=INF)return dp[l][r]; if(l==r)return dp[l][r]=a[l]+b[l-1]+b[l+1]; dp[l][r]=INF; for(int k=l;k<=r;k++) { dp[l][r]=min ( dp[l][r], dfs(l,k-1)+dfs(k+1,r)+a[k]+b[l-1]+b[r+1] ); } return dp[l][r]; } int main() { int T,cas=1; cin>>T; while(T--) { 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=0;i<=n;i++)for(int j=0;j<=n;j++)dp[i][j]=INF; printf("Case #%d: %I64d\n",cas++,dfs(1,n)); } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)
- Word Break I,II, Triangle,Palindrome Partitioning 动态规划 DP