hdu 5569 ***matrix

来源:互联网 发布:apache启动后立即停止 编辑:程序博客网 时间:2024/05/28 05:13

题意:给定n∗m(n+m为奇数)的矩阵,从(1,1)走到(n,m)且只能往右往下走,设经过的数为a1,a2...a2k,贡献为a1∗a2+a3∗a4+...+a2k-1*a2k,求最小贡献。


想法:简单的dp


代码如下:


#pragma warning(disable:4996)#include<iostream>#include<cstdio>#include<cmath>#include<stack>#include<cstring>#include<sstream>#include<set>#include<string>#include<iterator>#include<vector>#include<map>#include<algorithm>using namespace std;int dp[1010][1010];int matrix[1010][1010];int main(void) {    int n, m;    while (scanf("%d%d", &n, &m) == 2) {        for (int i = 1; i <= n; ++i)            for (int j = 1; j <= m; ++j)                scanf("%d", &matrix[i][j]);            memset(dp, 0, sizeof(dp));        for (int i = 1; i <= n; ++i)            for (int j = 1; j <= m; ++j) {                if ((i + j) % 2) {                    if (i == 1)                        dp[i][j] = dp[i][j - 1] + matrix[i][j] * matrix[i][j - 1];                    else if (j == 1)                        dp[i][j] = dp[i - 1][j] + matrix[i][j] * matrix[i - 1][j];                    else dp[i][j] = min(dp[i - 1][j] + matrix[i][j] * matrix[i - 1][j],                        dp[i][j - 1] + matrix[i][j] * matrix[i][j - 1]);                }                else {                    if (i == 1 && j != 1)dp[i][j] = dp[i][j - 1];                    else if (i != 1 && j == 1)dp[i][j] = dp[i - 1][j];                    else dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]);                }            }        cout << dp[n][m] << endl;    }}

0 0