USACO Mother's Milk, Number Triangles

Mother's milk不錯,蠻好的搜索題,寬搜、深搜都可以,我用的是寬搜+Hash,很快,十組數據都是0s AC。

代碼應該好懂,不羅嗦。實際上我也沒時間多說~嗚嗚嗚~~

 

/*

ID: fairyroad

PROG: milk3

LANG: C++

*/

 

#include<fstream>

#include<deque>

#include<algorithm>

//#include<iostream>

using namespace std;

 

struct state {

       int tag[3];

       state() {}

       state(const state& other){ for(int i = 0; i < 3; ++i) tag[i] = other.tag[i];}

};

ifstream fin("milk3.in");

ofstream fout("milk3.out");

int capacity[3]={0};

int rescount = 0;

int res[21];

const int prime[21] ={2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73};

bool flag[394420] = {false};

deque<state> ds;

 

inline int mapping( const state& s){

       return prime[s.tag[0]]*prime[s.tag[0]]*prime[s.tag[0]] + prime[s.tag[1]]*prime[s.tag[1]] + prime[s.tag[2]];

}

 

inline void pouring(const state& s, int active) {

       int i, diff, mapvalue;

       for(i = 0; i < 3; ++i){

              if(i == active) continue;

              if((diff = capacity[i]-s.tag[i]) != 0){

                  state p(s);

                     if(diff < p.tag[active]){

                            p.tag[i] = p.tag[i] + diff;

                            p.tag[active] = p.tag[active] - diff;

                     }

                     else{

                            p.tag[i] = p.tag[i] + p.tag[active];

                            p.tag[active] = 0;

                     }

                     if(p.tag[0]== 0 && count(res, res+rescount, p.tag[2]) == 0)

                res[rescount++] = p.tag[2];

                     mapvalue = mapping(p);

                     if(!flag[mapvalue]){

                flag[mapvalue] = true;

                ds.push_back(p);

                     }

              }

       }

}

 

int main(){

       fin>>capacity[0]>>capacity[1]>>capacity[2];

       state s, p;

    s.tag[0] = s.tag[1] = 0;

    s.tag[2] = capacity[2];

       for(int i = 0; i< 21; ++i) res[i]=-1;

 

    rescount = 0;

       ds.push_back(s);

 

       while(!ds.empty()){

           #ifdef DEBUG1

           for(size_t i = 0; i < ds.size(); ++i) cout<<ds[i].tag[0]<<' '<<ds[i].tag[1]<<' '<<ds[i].tag[2]<<endl;

           #endif

              p = ds.front();

 

              for(int i = 0; i < 3; ++i)

                     if( p.tag[i] != 0)

                            pouring(p, i);

 

              ds.pop_front();

       }

       sort(res, res+rescount);

    for(int i = 0; i < rescount-1; ++i)

        fout<<res[i]<<' ';

    fout<<res[rescount-1]<<endl;

    return 0;

}

numtri是道基本的DP題,更不必囉嗦。

/*

ID:fairyroad

LANG:C++

TASK:numtri

*/

#include<fstream>

using namespace std;

 

ifstream fin("numtri.in");

ofstream fout("numtri.out");

 

int m[1000][1000];

int value[1000];

inline int max(const int a, const int b){ return a > b ? a : b;}

 

int main(){

    int n, i, j;

 

       fin>>n;

       for(i = 0; i < n; ++i)

              for(j = 0; j < i+1; ++j)

                     fin>>m[i][j];

 

       for(i = 0; i < n; ++i) value[i] = m[n-1][i];

 

    for(i = n-2; i >= 0; --i)

        for(j = 0; j < i+1; ++j)

            value[j] = m[i][j] + max(value[j], value[j+1]);

 

       fout<<value[0]<<endl;

       return 0;

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章