1279:櫥窗佈置(flower)

 

【輸入樣例】

3 5 
7 23 –5 –24 16
5 21 -4 10 23
-21 5 -4 -20 20

【輸出樣例】

53 
2 4 5

 

#include<bits/stdc++.h>
using namespace std;
int f,v,dp[101][101],ma[101][101],ans[101][101];
int main()
{
    //memset(dp,-0x3f,sizeof(dp));
    cin>>f>>v;
    for(int i=1;i<=f;i++)
    {
        for(int j=1;j<=v;j++)
            cin>>ma[i][j];
    }//輸入
    for(int i=1;i<=f;i++)
        dp[i][i]=dp[i-1][i-1]+ma[i][i];//這我卡了一會,在洛谷看了題解纔想起來了這個初值
    for(int i=1;i<=v;i++)
        for(int j=1;j<=f;j++)
        {
            dp[i][j]=-1e+8;//初值,因爲有負數所以0不行
            for(int k=0;k<=i-j;k++)//枚舉子問題
            {
                if(dp[k+j-1][j-1]+ma[j][k+j]>dp[i][j])
                {
                    ans[i][j]=k+j;
                    dp[i][j]=dp[k+j-1][j-1]+ma[j][k+j];
                }
            }
        }
    cout<<dp[v][f]<<endl;//輸出最大值
    stack<int> st;
    int a=f,b=v;
    for(int i=1;i<=f;i++)//反推過程
    {
        st.push(ans[b][a]);
        b=ans[b][a]-1;
        a--;
    }
    bool f=1;
    while(!st.empty())//輸出過程
    {
        if(f)
        {
            f=0;
            cout<<st.top();
        }
        else cout<<" "<<st.top();
        st.pop();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章