• hdu 5569 matrix dp


    matrix

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://acm.hdu.edu.cn/showproblem.php?pid=5569

    Description

    Given a matrix with n rows and m columns ( n+m is an odd number ), at first , you begin with the number at top-left corner (1,1) and you want to go to the number at bottom-right corner (n,m). And you must go right or go down every steps. Let the numbers you go through become an array a1,a2,...,a2k. The cost is a1∗a2+a3∗a4+...+a2k−1∗a2k. What is the minimum of the cost?

    Input

    Several test cases(about 5)

    For each cases, first come 2 integers, n,m(1≤n≤1000,1≤m≤1000)

    N+m is an odd number.

    Then follows n lines with m numbers ai,j(1≤ai≤100)

    Output

    For each cases, please output an integer in a line as the answer.

    Sample Input

    2 3
    1 2 3
    2 2 1
    2 3
    2 2 1
    1 2 4

    Sample Output

    4
    8

    HINT

    题意

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

    题解:

    dp[i][j]表示走到i,j的最小贡献,我们只考虑(i+j)为奇数的时候就好了

    然后转移的时候,也只会从奇数位置转移过来

    代码:

    #include<iostream>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m;
    int mp[1005][1005];
    int dp[1005][1005];
    const int inf = 1e9+5;
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=0;i<=n;i++)
                for(int j=0;j<=m;j++)
                    dp[i][j]=inf;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    mp[i][j]=read();
            dp[1][0]=0,dp[0][1]=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if((i+j)%2)
                    {
                        dp[i][j]=inf;
                        if(i>1&&j>1)
                            dp[i][j]=min(dp[i][j],dp[i-1][j-1]+min(mp[i-1][j]*mp[i][j],mp[i][j-1]*mp[i][j]));
                        if(i>1)
                            dp[i][j]=min(dp[i][j],dp[i-2][j]+mp[i-1][j]*mp[i][j]);
                        if(j>1)
                            dp[i][j]=min(dp[i][j],dp[i][j-2]+mp[i][j]*mp[i][j-1]);
                    }
                }
            }
            printf("%d
    ",dp[n][m]);
        }
    }
  • 相关阅读:
    如何做一个快乐的人
    嵌入式实时操作系统的可裁剪性及其实现
    Hello China操作系统运行截图(完整版)
    物联网操作系统的概念和特点
    Windows Phone 31日谈——第4日:设备方向
    Windows Phone 31日谈——第6日:工具栏
    Windows Phone 31 日谈——第8日:选择器
    Windows Phone 31日谈——第5日:系统主题
    Windows Phone 31 日谈——第10日:输入范围和文本框
    Windows Phone 31 日谈——第13日:位置服务
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4985567.html
Copyright © 2020-2023  润新知