sgu 104. Little shop of flowers

http://acm.sgu.ru/problem.php?contest=0&problem=104

水题 DP   但是wa了一次 本来应该初始化为负无穷的 结果初始化为0了 细节呀

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<algorithm>

#include<cmath>

#include<map>

#include<set>

#include<vector>

#include<stack>

#include<queue>



#define ll long long



using namespace std;

const int INF=0x3f3f3f3f;

const int N=105;

int v[N][N];

int dp[N][N];

int pre[N][N];

int main()

{

    //freopen("data.in","r",stdin);

    int n,m;

    while(cin>>n>>m)

    {

        memset(pre,0,sizeof(pre));

        memset(v,0,sizeof(v));

        for(int i=1;i<=n;++i)

        for(int j=1;j<=m;++j)

        dp[i][j]=-INF;

        for(int i=1;i<=n;++i)

        for(int j=1;j<=m;++j)

        cin>>v[i][j];

        for(int i=1;i<=n;++i)

        for(int j=i;j<=m;++j)

        {

            if(i==1) {dp[i][j]=v[i][j];continue;}

            for(int w=i-1;w<j;++w)

            {

                if(dp[i][j]<dp[i-1][w]+v[i][j])

                {

                    dp[i][j]=dp[i-1][w]+v[i][j];

                    pre[i][j]=w;

                }

            }

        }

        int I=n,J=1;

        for(int j=1;j<=m;++j)

        if(dp[n][j]>dp[n][J])

        J=j;



        cout<<dp[I][J]<<endl;

        stack<int>st;

        while(I>=1)

        {

            st.push(J);

            int l=I,r=J;

            I=l-1;

            J=pre[l][r];

        }

        while(!st.empty())

        {

            cout<<(st.top())<<" ";

            st.pop();

        }cout<<endl;



    }

	return 0;

}

  

你可能感兴趣的:(it)