zoukankan      html  css  js  c++  java
  • CodeForces 1107F. Vasya and Endless Credits

    题目简述:给定 $n leq 500$ 个贷款方式,其中第$i$个贷款额为$a_i$元,需要$k_i$个月偿还,每月还贷$b_i$元。在每个月月初可申请其中一个贷款,而在每个月月底时需要还贷。求:(在某一时刻)可获得的最多贷款。

    观察1:获得最多贷款的时刻一定在$n$月以内。

    解1:(二分图最佳匹配,最小费用最大流)code

    观察2:倒数第$j$个月申请的第$i$个贷款,在获得最多贷款的时刻之前,需要还贷$b_imin{k_i,j-1}$元。

    设$X$部有$n$个点,记为$X_i$,表示第$i$个贷款方式;$Y$部有$n$个点,记为$Y_j$。$X_i$和$Y_j$之间的连线表示倒数第$j$个月申请第$i$个贷款。

    连边$(X_i, Y_j)$,权值为$max{a_i-b_imin{k_i,j-1},0}$。二分图最佳匹配即为答案。使用KM算法求二分图最佳匹配,时间复杂度为$O(n^3)$。

    解2:(动态规划)code1 code2

    观察3:在最优解中,第$n$个月仍未完成还贷的贷款方式的申请顺序按$b_i$递增。

    将所有贷款方式按$b_i$降序排序后,设$F[i][j]$表示前$i$个贷款方式中【有$j$种贷款方式在第$n$个月仍未完成还贷】的最优解,则

    $F[i][j] = max{ F[i-1][j]+max{a_i-b_i k_i, 0}, F[i-1][j-1]+a_i-b_i(j-1) },$

    其中$F[0][0] = 0$,$F[i][j] = -infty$ 若 $j < 0$,且$F[i][j] = 0$ 若 $j > i$。

    时间复杂度为$O(n^2)$。

  • 相关阅读:
    .NET 内存分配笔记
    MYSQL知识点
    NOPI导入导出
    【链接】各类学习资源
    【原创】重绘winform的GroupBox
    高仿淘宝滑动验证码插件
    Winform窗体控件级权限处理
    .NET中的Func委托用法
    关于IBatisNet的配置文件中数据库连接字符串加密处理
    Oracle连接字符串大全
  • 原文地址:https://www.cnblogs.com/TinyWong/p/10343282.html
Copyright © 2011-2022 走看看