• 花店橱窗


    花店橱窗

    现在有f朵花,v个花瓶摆成一排,第i朵花放在第j个花瓶的美学值记做(a[i][j]),现在要把所有花放入花瓶,并保证花瓶从左至右放的编号递增,同一个花瓶最多只能放一朵花,问最大的美学值之和,(1<=F<=V<=100)

    显然既要表现花,又要表现花瓶,没有特殊限制,故设(f[i][j])表示前i朵花放到前j个花瓶的最大美学值之和,因此不难有

    [f[i][j]=max(f[i][j-1],f[i-1][j]+a[i][j]) ]

    边界:(f[0][0]=0),其余负无限大

    答案:(f[f][v])

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define il inline
    #define ri register
    using namespace std;
    int a[101][101],dp[101][101],
        pre[101][101];
    void print(int,int);
    int main(){
        int f,v;
        scanf("%d%d",&f,&v);
        for(int i(1),j;i<=f;++i)
            for(j=1;j<=v;++j)
                scanf("%d",&a[i][j]);
        memset(dp,-2,sizeof(dp));
        for(int i(0);i<=v;++i)dp[0][i]=0;
        for(int i(1),j;i<=f;++i)
            for(j=i;j<=v;++j){
                if(dp[i][j-1]<dp[i-1][j-1]+a[i][j])
                    dp[i][j]=dp[i-1][j-1]+a[i][j],pre[i][j]=1;
                else dp[i][j]=dp[i][j-1];
            }printf("%d
    ",dp[f][v]),print(f,v);
        return 0;
    }
    void print(int a,int b){
        if(!a||!b)return;
        if(pre[a][b])print(a-1,b-1),printf("%d ",b);
        else print(a,b-1);
    }
    
  • 相关阅读:
    vue-cli工具搭建vue-webpack项目
    关于闭包的理解
    运动-分页
    运动-无缝滚动
    运动-手风琴
    运动-模拟返回顶部
    运动—图片中心放大
    运动—运动框架
    webstorm 激活破解
    let和const
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/10995747.html
Copyright © 2020-2023  润新知