zoj 1524 - Supermarket

来源:互联网 发布:淘宝上如何买到真牛排 编辑:程序博客网 时间:2024/06/05 01:19

题目:去超市购物,你有一个购物单,买东西按照商店的顺序,并且不能倒退,求最小花费。。

分析:dp,LCS。没有用LCS算法,代价是一样的,用串 B逆向的与串 A进行匹配(避免后效性);

           这么写起来,觉得很像是单调队列优化的 LIS。。。代价等同LCS,T = O(MN)

说明:看错题目了,以为list 一定是非严格单调的,想用二分来的。。。(2011-9-24 12:34

#include <stdio.h>#include <stdlib.h>#include <math.h>#define min( a, b ) ((a)<(b)?(a):(b))#define INF 10000001.0typedef struct node1{    int   good;    float cost;}food;food Food[ 100001 ];int   list[ 101 ];float mval[ 101 ];int main(){    int n,m;    while ( scanf("%d%d",&n,&m) && (m+n) ) {        for ( int i = 1 ; i <= n ; ++ i )            scanf("%d",&list[ i ]);        for ( int i = 1 ; i <= m ; ++ i )            scanf("%d%f",&Food[ i ].good,&Food[ i ].cost);                for ( int i = 1 ; i <= n ; ++ i )            mval[ i ] = INF;        mval[ 0 ] = 0.0;        for ( int i = 1 ; i <= m ; ++ i )         for ( int j = min(n,m) ; j >= 1 ; -- j )            if ( Food[ i ].good == list[ j ] && mval[ j ] > mval[ j-1 ] + Food[ i ].cost )                mval[ j ] = mval[ j-1 ] + Food[ i ].cost;        if ( fabs( mval[ n ] - INF ) < 0.1 )            printf("Impossible\n");        else            printf("%.2f\n",mval[ n ]);    }    return 0;}

0 0
原创粉丝点击