HDU5569(动态规划)
2015-12-04 13:06
190 查看
题目大意:给你一个n*m的矩阵,从左上角走到右下角,经过的数字为a1,a2...ak,问怎样能使a1*a2+a3*a4+a5*a6+...+ak-1*ak的值最小。
思路:很明显是一道动态规划问题。
转移方程:当行列的和为偶数时,dp[i][j]=min(dp[i-1][j],dp[i][j-1]);
当行列的和为奇数时,dp[i][j]=min(dp[i-1][j]+a[i-1][j]*a[i][j],dp[i][j-1]+a[i][j-1]*a[i][j]);
注意初始化。
思路:很明显是一道动态规划问题。
转移方程:当行列的和为偶数时,dp[i][j]=min(dp[i-1][j],dp[i][j-1]);
当行列的和为奇数时,dp[i][j]=min(dp[i-1][j]+a[i-1][j]*a[i][j],dp[i][j-1]+a[i][j-1]*a[i][j]);
注意初始化。
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<iostream> #include<queue> #include<stack> #include<set> #include<map> using namespace std; const int inf=0x3f3f3f3f; int a[1010][1010],dp[1010][1010]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(dp,inf,sizeof dp); dp[0][1]=dp[1][0]=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if((i+j)%2==0) { dp[i][j]=min(dp[i-1][j],dp[i][j-1]); } if((i+j)%2==1) { dp[i][j]=min(dp[i-1][j]+a[i-1][j]*a[i][j],dp[i][j-1]+a[i][j-1]*a[i][j]); } } } printf("%d\n",dp [m]); } return 0; }
相关文章推荐
- UVa 10560 Minimum Weight
- EF下lambda与linq查询&&扩展方法
- 线程上下文切换的性能损耗测试
- 比亚迪4S店疑旧车翻新 保险杠有老漆
- 深度优先搜索 之 CODE[VS] 1116 四色问题
- 百度地图API-自定义Lushu
- Android 多态知识使用实例(一)
- 我国已有1.39亿司机领取10年有效驾照
- MyEclipse10采用links安装插件的方法
- CentOS6.6下安装VMware Tools
- Tsinsen-1487:分配游戏【树状数组】
- 【C语言】 动态开辟二维数组
- HDU5475(线段树)
- Android4.0-Fragment框架实现方式剖析(一)
- 关于java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream解决办法
- UVa 10651 Pebble Solitaire(状压DP)
- 【转】Android Studio Essential Training
- random类的使用
- 数据结构基础知识之结构体
- iOS-UIKit( UIVisualEffectView.h - -解读)