HDU 1081 To The Max

来源:互联网 发布:linux下路由跟踪命令 编辑:程序博客网 时间:2024/06/05 12:06

HDU 1081 To The Max

其实这道题不是特别复杂,直接暴力求解就可以了你n^4(实际没这么高)

不过今天学习了新的办法,所以尝试一下最大子矩阵,下面是两种方法的代码


最大子矩阵

/**HDU 1081 To The Max通过这道题检验一下自己学习的最大子矩阵利用最大子段和的状态转移方程f[i]=max(a[i],a[i]+f[i-1]);得出:dp[i][j][k]=max(fun(i,j,k),fun(i,j,k)+dp[i-1][j][k]);*/#include<algorithm>#include<iostream>#include<cstdio>#include<cstring>#define ll long long#define maxn 105using namespace std;int dp[maxn][maxn][maxn];int a[maxn][maxn];int sum[maxn][maxn];void Init_sum(int n){    memset(sum,0,sizeof(sum));    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            sum[i][j]=sum[i-1][j]+a[i][j];}int fun(int c,int ru,int rd){ //计算c列从ru行到rd行的和    return sum[rd][c]-sum[ru-1][c];}int main(){    int n;    while(~scanf("%d",&n)){        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                scanf("%d",&a[i][j]);        Init_sum(n);        memset(dp,0,sizeof(dp));        int ans=-1e9;        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                for(int k=j;k<=n;k++){                    dp[i][j][k]=max(fun(i,j,k),fun(i,j,k)+dp[i-1][j][k]);                    ans=max(ans,dp[i][j][k]);                }        printf("%d\n",ans);    }    return 0;}


暴力求解

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int MAXN=105;int a[MAXN][MAXN];int main(){    int n,s;    int nmax;    while(~scanf("%d",&n)){        memset(a,0,sizeof(a));        for(int i=1;i<=n;i++){            for(int j=1,ma=0;j<=n;j++){                scanf("%d",&s);                a[i][j]=s+ma+a[i-1][j];                ma+=s;            }        }        nmax=a[1][1];        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                for(int k=0;k<i;k++){                    for(int t=0;t<j;t++){                        nmax=max(nmax,a[i][j]-a[k][j]-a[i][t]+a[k][t]);                    }                }            }        }        printf("%d\n",nmax);    }    return 0;}




0 0
原创粉丝点击