• Joyoi花店橱窗(原tyvj1124)


    题目:http://www.joyoi.cn/problem/tyvj-1124

    两点注意!!!

    1.滚动数组的初始化;

    2.字典序操作!

    感到很有趣!!!

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int INF=-0x7fffffff;
    int n,m,pos[105][105],pre[105][105],ans[105];
    long long a[105][105],d[2][105],mx=INF;
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%lld",&a[i][j]);
        for(int i=1;i<=m;i++)
        {
            if(a[1][i]>mx)
            {
                mx=a[1][i];
                pos[1][i]=i;
            }
            else pos[1][i]=pos[1][i-1];
            d[1][i]=mx;
        }
        for(int i=2;i<=n;i++)
        {
            d[i%2][i-1]=INF;//////因为是滚动数组,故初始化memset INF有漏洞 ,且i+1的时候不会用到这里了,可放心 
            for(int j=i;j<=m-(n-i);j++)
            {
                if(d[i%2][j-1]>=d[(i-1)%2][j-1]+a[i][j])//////字典序 
                {
                    d[i%2][j]=d[i%2][j-1];
                    pos[i][j]=pos[i][j-1];
                    pre[i][j]=pre[i][j-1];
                }
                else
                {
                    d[i%2][j]=d[(i-1)%2][j-1]+a[i][j];
                    pos[i][j]=j;
                    pre[i][j]=pos[i-1][j-1];
                }
            }
        }
        printf("%lld
    ",d[n%2][m]);
        int k=pos[n][m];
        for(int i=n;i;i--)
        {
    //        while(a[i][k-1]==a[i][k])k--;//////字典序 (不行!会过头……)
            ans[i]=k;
            k=pre[i][k];
        }
        for(int i=1;i<=n;i++)
            printf("%d ",ans[i]);
        return 0;
    }
  • 相关阅读:
    汉字在屏幕上的显示
    手机上的ROM与RAM
    数据表示和计算
    存储器的层次结构
    计算机系统概述
    Python中的文件路径的分隔符
    网络爬虫的基本原理
    iOS多线程简介
    Quartz2D简介
    iOS 事件传递响应链
  • 原文地址:https://www.cnblogs.com/Narh/p/8457694.html
Copyright © 2020-2023  润新知