uva 1204 Fun Game 有趣的游戏 字符串集合的动态规划


不得不说,此题很难,不得不说,我很渣,看了题解,自己写代码,不但写了一大堆,后来WRONG ANSWER还找不到错了。


只好看紫书的代码。。。


发现好多实用的函数的写法



reverse(tmps[i].rev.begin(),tmps[i].rev.end());
if(tmps[j].s.find(tmps[i].s)!=string::npos || tmps[j].s.find(tmps[i].rev)!=string::npos)

 bool operator<(const Node  y)const
    {
        return s.length()

代码这个东西,写的越长,错误的几率就越大。


回顾:



思路:先考虑一排+不能翻转(定了传递顺序)的情形,从简单情形入手

简化与初步分析:剔除完全能被其它字符串包含的字符串

解法:分阶段的动归

集合表示哪些字符串已经取了。加上一维表示最后一个字符串是谁。神奇,分阶段+集合

这里的集合用的相当好,我不用知道字符串时怎样排列的,只用知道用了哪些字符串,最后排的字符串是谁,然后最优值是多少。

约制(有益无害):1.从左往右安排字符串。

                    2.第一个放的字符串必须是编号为0(如果编号从1开始,则放1)的字符串






学着写了份代码:

/**==========================================
 *   This is a solution for ACM/ICPC problem
 *
 *   @source:uva 1204
 *   @type:
 *   @author: wust_ysk
 *   @blog:  http://blog.csdn.net/yskyskyer123
 *   @email: [email protected]
 *===========================================*/
#include
#include
#include
#include
#include
#include
#define ysk(x)  (1<<(x))
#define REP(i,n) for(int i = 0; i < (n); i++)
using namespace std;
typedef long long ll;
const int INF =0x3f3f3f3f;
const int maxn=16    ;
//const int maxV=12    ;
int n,tot;
int same[maxn+3][maxn+3][2][2];
struct Node
{
    string s,rev;
    bool operator<(const Node  y)const
    {
        return s.length()>n&&n)
    {
        REP(i,n)
        {
            cin>>tmps[i].s;
            tmps[i].rev=tmps[i].s;
            reverse(tmps[i].rev.begin(),tmps[i].rev.end());
        }
        init();
        work();
    }

   return 0;
}



你可能感兴趣的:(想破脑壳也想不出的难问题,ACM_动态规划,思维较强较难的dp题)