• 洛谷P1854花店橱窗布置-题解


    原题:

    思路:

    考虑DP

    设f[i][j]为考虑前i行,第i行选第j个的最大值

    则f[i][j]=max(f[i-1][j])+d[i][j]

    这道题由于有枚举成分在,如果用DFS就会超时

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n,m;
    int pre[150][150];
    int a[150][150];
    int f[150][150];
    void print(int x,int y)
    {
        if(pre[x][y]==y)
        {
            cout << y << ' ';
            return;
        }
        print(x-1,pre[x][y]);
        cout << y << ' ';
    }
    int main()
    {
        cin >> n >> m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin >> a[i][j];
        for(int i=1;i<=m-n;i++) 
        {
            f[1][i]=a[1][i];
            pre[1][i]=i;
        }
        for(int i=2;i<=n;i++)
            for(int j=i;j<=m-n+i;j++)
                for(int k=1;k<j;k++)
                    if(f[i][j]<f[i-1][k]+a[i][j])
                    {
                        f[i][j]=f[i-1][k]+a[i][j];
                        pre[i][j]=k;
                    }
        int tx=n,ty,ans=0;
        for(int i=n;i<=m;i++)
            if(f[n][i]>ans)
            { 
                ans=f[n][i]; 
                ty=i;
            }
        printf("%d
    ",ans);
        print(tx,ty);
        return 0;
    }
    

      

  • 相关阅读:
    MySQL主从半同步复制
    MySQL主从之延时复制
    MySQL备份
    MySQL主从介绍及搭建(异步复制)
    MySQL物理备份Xtrabackup
    MySQL数据库误删除数据恢复
    MySQL--日志
    JAVA日报
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/lujin49/p/13511611.html
Copyright © 2020-2023  润新知