ac自動機上的最短路問題,題目要求所經過結點公升序,且規定某些線路是不合法的,對應於ac自動機上的非法狀態。
這道題目大部分題解是用dp來做的,而我是用dijstra變形來解決這個題目的(同上篇文章)。
做了好幾天的ac自動機的習題,對於ac自動機還是有了一些理解,ac自動機在某個角度來看就是一張有特殊限制的圖,每個結點代表不同狀態,有不同的狀態轉移方程~~~~~
//ac自動機上跑最短路
#include #include #include #include #include #include using namespace std;
const int maxn=60;
const int maxm=1000;
double dis[maxn][maxn];
pairpoint[maxn];
struct node_t
node[maxm];
int toused;
inline void init_trie()
inline node_t* _newnode()
inline void insert(int k)
loc->flag=true;
}void build_ac(int n)
}while(!que.empty())}}
}struct info
bool operator < (const info& r)const
};node_t *linker[maxm][maxn];
double disk[maxn][maxm];
void bfs(int n)
else
while(!que.empty())
for(int i=u+1;i<=n;i++)}}
printf("can not be reached!\n");
}inline double dist(int i,int j)
int main()
build_ac(n);
for(int i=0;ison[j]==null) loc=loc->fail;
loc=loc?loc->son[j]:node;
linker[i][j]=loc;
}bfs(n);
}return 0;
}
小明系列故事 買年貨(HDU)
題意理解 有n個可以買的年貨,每個年貨有單價,抵扣的積分和實際的價值,小明手裡有v1的錢,v2的積分,可免費的年貨數量k。問如何買才能使年貨總的價值最大?問題分析 多維01揹包問題,用dp。動態規劃要找狀態,然後找狀態轉移方程。對於本題,狀態是dp ii jj kk ll 表示前ii個年貨花了jj錢...
HDU 4528 小明系列故事 捉迷藏
小明的媽媽生了三個孩子,老大叫大明,老二叫二明,老三.老三自然就叫小明了。一天,小明的媽媽帶小明兄弟三人去公園玩耍,公園裡面樹木很多,有很多地方可以藏身,於是他們決定玩捉迷藏。經過幾輪的猜拳後,第一輪是小明來找其他兩個人,遊戲規則很簡單 只要小明可以在規定的時間內找到他們就算小明獲勝,並且被發現的兩...
HDU 4501 小明系列故事 買年貨
解題思路 三維揹包,設定dp i j k 代表有i塊錢,有j個積分和k個免費物品的時候,可以得到的最大價值。則對於當前物品,我有兩種選擇 第一種 不買 第二種 買 如果選擇買又分了三種情況,1.用錢買。dp i 錢 j k 價值 2.用積分買。dp i j 積分 k 價值 3.免費拿。dp i j ...