ZCMU-1492-石头(dp,dfs)

来源:互联网 发布:人工智能机器人价格 编辑:程序博客网 时间:2024/06/04 17:53

1492: Problem D

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 175  Solved: 68
[Submit][Status][Web Board]

Description

Chieh最近在网上看到蓝翔非常火热。不知为什么他想到了一个问题,有一个n*m的矩阵

每一个小块里有k个石头。。现在挖掘机在左上角,挖掘机非常强大。。可以放无限的石头

但是它只能往右或者往下移动,现在Chieh想知道最多的石头从左上角到右下角。

Input

T 组数 T<=100

n m  1<=n. m<=1000

n行m个数 为石头数量 0<=s<=1000

Output

对于每组测试数据,输出对应的答案。

Sample Input

2
1 1
1
4 3
1 3 4
11 32 4
11 32 11
44 21 41

Sample Output

1
138

【解析】
这道题的话其实一开始觉得应该是dfs毕竟我们可以模拟出每一条路径然后就行比较,相当于建立一个解空间树一样的过程这个算法我还是不熟...这样可以是可以不过超时了...可能是递归对于大数据效率比较低的缘故,.后来看了一下他人的解释这个DP也是可以的,通过了...此处附上dfs代码和dp的代码。
DP
#include <iostream>#include <cstdio>#include <algorithm>#include<cstring>using namespace std;int value[1024][1024];int main(){    int m, n,t;    scanf("%d",&t);    while(t--)    {        memset(value,0,sizeof(value));    scanf("%d%d", &m, &n);    for (int i = 0; i < m; ++i)    {        for (int j = 0; j < n; ++j)        {            scanf("%d", &value[i][j]);        }    }    for (int i = 1; i < m; ++i)    {        value[i][0] += value[i - 1][0];//往下面    }    for (int j = 1; j < n; ++j)    {        value[0][j] += value[0][j - 1];//往右边    }    for (int i = 1; i < m; ++i)    {        for (int j = 1; j < n; ++j)        {            value[i][j] += max(value[i - 1][j], value[i][j - 1]);//刚开始是先将第一列和第一行的给初始化了,他们可以走到那个地方        }    }    printf("%d\n",value[m - 1][n - 1]);}    return 0;}
dfs
#include<iostream>#include<string>#include<string.h>#include<stdlib.h>#include<cstdio>#include<vector>using namespace std;int n,m;vector<vector<int> >c;vector<int>q;int max(int i, int j){    return i > j ? i : j;}int facs(int a,int b){    if(a==n||b==m)        return 0;   else if(a==n-1&&b==m-1)        return c[a][b];    else        return max(facs(a+1,b),facs(a,b+1))+c[a][b];}int main(){    int t,i,j,p;    scanf("%d",&t);    while(t--)    {        c.clear();        q.clear();        scanf("%d%d",&n,&m);        for(i=0;i<n;i++)        {            for(j=0;j<m;j++)            {                scanf("%d",&p);                q.push_back(p);            }            c.push_back(q);            q.clear();        }        printf("%d\n",facs(0,0));    }    return 0;}



0 0