hd 1058 dp

呵呵呵,这题的话,去年不知道怎么就水过去了,现在做还是懵逼了

总是感觉这题很奇怪,哎

2,3,5,7的系数必然在已打出的表中取

状态转移方程

dp(n) = min(dp[i]*2,dp[j]*3,dp[k]*5,dp[l]*7)

i<=j<=k<=l<n,

a[4]={2,3,5,7}

用一个一维数组保存下标,cnt[i]记录a[i]所能取得的最大表下标

1.遍历所有的cnt[i]找最小值

  mmin为dp[cnt[i]*a[i]]中的最小值

2.遍历所有的cnt[i],更新cnt[i]

  if dp[cnt[i]]*a[i]==mmin

    cnt[i]++;

//5842

#include <iostream>
#include<cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>

using namespace std;
const int inf = (1<<31)-1 ;
const int MAXN = 6e3;
int dp[MAXN];
int a[4]={2,3,5,7};
int ct[4]={1,1,1,1};

int main()
{
    int n;
    int mmin;
    dp[1] = 1;
    for(int i=2;i<=5842;i++){
        mmin = inf;
        for(int j=0;j<4;j++){
            mmin = min(mmin,a[j]*dp[ct[j]]);
        }
        dp[i] = mmin;
        for(int j=0;j<4;j++){
            if(dp[i]==a[j]*dp[ct[j]])
                ct[j]++;
        }
    }

    while(scanf("%d",&n),n){
        cout<<"The "<<n;
        if(10<n&&n<20)cout<<"th ";
        else if(n%10==1)cout<<"st ";
        else if(n%10==2)cout<<"nd ";
        else if(n%10==3)cout<<"rd ";
        else cout<<"th ";
        cout<<"humble number is "<<dp[n]<<"."<<endl;
    }
    //cout << "Hello world!" << endl;
    return 0;
}

时间: 2024-10-09 08:07:02

hd 1058 dp的相关文章

Blocks题解(区间dp)

Blocks题解 区间dp 阅读体验...https://zybuluo.com/Junlier/note/1289712 很好的一道区间dp的题目(别问我怎么想到的) dp状态 其实这个题最难的地方是这道题目的状态怎么设 首先既然是区间dp,那肯定最先想到的状态是 $dp[i][j]$表示消掉区间$[i,j]$上所有的块的最大分数 突然发现这个状态会受区间外和$i$或$j$颜色相同的块的影响 并且转移也并不好转移=_= 所以我们考虑换一种状态... 既然说会受到外面的块的影响?那考虑一种方法来

Gym - 101981B Tournament (WQS二分+单调性优化dp)

题意:x轴上有n个人,让你放置m个集合点,使得每个人往离他最近的集合点走,所有人走的距离和最短. 把距离视为花费,设$dp[i][k]$表示前i个人分成k段的最小花费,则有递推式$dp[i][k]=min\{dp[j][k-1]+w(j,i)\}$,其中$w(j,i)$可以$O(1)$求出. 显然,如果考虑段数的话,光状态数就有n^2个,肯定行不通.不过这题的最优解对段数的函数是凸的,因此可以用WQS二分来打破段数的限制. 给每个集合点加上一个额外的花费c,然后忽略段数的限制,这样递推式就变成了

洛谷P2365 任务安排 [解法二 斜率优化]

解法一:http://www.cnblogs.com/SilverNebula/p/5926253.html 解法二:斜率优化 在解法一中有这样的方程:dp[i]=min(dp[i],dp[j]+(sumf[i]-sumf[j])*sumt[i]+s*(sumf[n]-sumf[j]) ) 其中min的后半部分,也就是dp[j]+(sumf[i]-sumf[j])*sumt[i]+s*(sumf[n]-sumf[j]) 计算了将j~i分为一组的花费(以及提前计算的受影响花费) 设f(j)=dp[

hdu_1058

末尾是1 但不是11的 st 末尾是2 但不是12的 nd 末尾是3 但不是13的 rd 其他 th 打表过程: dp[x]代表第x个humble number dp中所有元素都是从1开始,*2 *3 *5 *7得到 // hdu 1058 // dp 打表 // Feb.16 2015 #include <cstdio> #include <algorithm> int dp[5900], n, n2, n3, n5, n7; void pre_do() { dp[1] = 1;

USACO 土地购买

P1177 - [USACO ]土地购买 Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多块土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ

bjoj1911 [Apio2010] 序列分割

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4486  Solved: 2140[Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT Source [Submit][Status][Discuss] 转化条件,挖掘深入信息,答案其实就是等于k+1段两两

Dp46道和近期小结

最近做题比较散漫,无脑.中间打了个校赛,弱弱的水了几题,然后就挂机了,最后一个半小时都在酱油,结果也不是很好. 中间大概有三场bc是爆零了,快浅绿了.cf 打了两场只有only div2的,还好比较容易涨,大号终于紫了. Hdu Dp入门题总结,时间隔的比较长,大概有一个月了..网上写的也比较详细,这6题还是记忆犹新的,其他的就不说了. Cstructing Roads http://acm.hdu.edu.cn/showproblem.php?pid=1025 以前做过,按照一维排序,另一位用

HDU 2829 Lawrence

Lawrence Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 282964-bit integer IO format: %I64d      Java class name: Main T. E. Lawrence was a controversial figure during World War I. He was a British officer w

POJ 1821 Fence

Fence Time Limit: 1000ms Memory Limit: 30000KB This problem will be judged on PKU. Original ID: 182164-bit integer IO format: %lld      Java class name: Main A team of k (1 <= K <= 100) workers should paint a fence which contains N (1 <= N <=