【动态规划 变形】Pick numbers:实际上还是背包

来源:互联网 发布:cnc编程兼职工资怎么算 编辑:程序博客网 时间:2024/06/06 10:44

Example:pick numbers (scicily 1158 http://soj.me/1158)

菜鸟:BFS

大牛:DP

大牛的代码:你用多长时间看懂了?

/***sicily 1158 pick numbers*M, N (2<=M<=10, 2<=N<=10),**/#include <iostream>using namespace std;#define Max 15#define Mid 200// 和的范围[-190,190]int main_(){int m,n,ans;int a[Max][Max];// matrixbool dp[Max][Max][Mid*2];// 第三维代表“到达一个位置所有的路径之和(-190到190之间)while(cin>>m>>n){memset(a, 0, sizeof(a));memset(dp, false, sizeof(dp));ans = -1;int i,j;for(i=1; i<=m; i++)for(j=1; j<=n; j++)cin >>a[i][j];dp[1][1][Mid + a[1][1]] = true;// 加上Mid 防止下标为负for(i=1; i<=m; i++)for(j=1; j<=n; j++)if(i!=1 || j!=1){for(int k=0; k<Mid*2; k++)// 遍历所有的路径和{if(dp[i-1][j][k])// 可以从上边到达dp[i][j][k+a[i][j]] = true;if(dp[i][j-1][k])// 从左边到达dp[i][j][k+a[i][j]] = true;}}for(int k=Mid+1; k<Mid*2; k++)// 最小的正值if(dp[m][n][k]){ans = k-Mid;break;}cout << ans << endl;}return 0;}


0 0
原创粉丝点击