ZOJ 3077 记忆化动态规划

记忆化搜索是什么?很熟悉的名字~~

如果是指动态规划的记忆化方法的话就感觉很不合适了,那哪是搜索啊 —_—

 

这题其实很水,昨天早上写好,但是到昨天晚上了还没交掉。

一直WA,把标程都哪来对拍了,排得我的电脑都烂了,还是没拍出错误来。

(对拍也是很烦的事情,因为要生成测试数据,这个一般情况下都不好生成啊~~)

晚上睡觉前一看,发现浮点数输出直接“#什么NAN”了。一看初始化,竟然用memset给double类型的赋值了。—_—

 

这几天悲剧连连啊。下面贴上代码:

#include <cstdio> #include <cstring> #include <set> #include <algorithm> using namespace std; set<int> st; int org[210], pai[210]; double dp[210][210]; double a, b; double gao(int l, int r, int s) { if(r < l) return 0.0; double& tt = dp[l][r]; if(tt != -1) return tt; double m = 0.0; for(int i = l; i <= r; i++) { if(org[i] == s) { m += a+b*gao(l, i-1, s)+(1-a-b)*gao(i+1, r, s); } else { m += b*gao(l, i-1, s)+(1-a-b)*gao(i+1, r, s); } } return tt = m/(r-l+1); } int main(int argc, char* argv[]) { int n, k; while(scanf("%d", &n) != EOF) { if(n < 0) break; fill(dp[0], dp[n], -1); for(int i = 0, t; i < n; i++) { scanf("%d", &t); org[i] = t; st.insert(t); } scanf("%d %lf %lf", &k, &a, &b); if(st.size() < k) { printf("0.000/n"); st.clear(); continue; } set<int>::iterator it = st.begin(); for(int j = 1; j < k; j++) { it++; } printf("%.3lf/n", gao(0, n-1, *it)); st.clear(); } return 0; } 

你可能感兴趣的:(ZOJ 3077 记忆化动态规划)