SNAIL(カタツムリ)


(ソース)https://algospot.com/judge/problem/read/SNAIL
1回の場合に発生する2つのケースを統合
DP問題を解くと,一度の場合に発生する可能性のある特定の状況をすべて加算し,所望の答えを算出する場合が多く,このような場合は再帰的に問題を解決することが多い.この問題は1日雨が降らない場合と雨が降らない場合に分けられ、それぞれ帰郷して解決した後、最終的に合併して解決する.cache[depth][days] == 남은 days 동안 depth를 올라갈 수 있는 확률 cache[depth][days] = (0.75 * cache[depth - 2] [days -1]) + (0.25 * cache[depth -1] [days -1 ])部分問題の総深さ*日は,各部分問題の計算時間が定数時間に過ぎないため,時間複雑度はO(Depth*日)である.したがって,問題で与えられた最大入力で計算すると,約100万回の計算を実行するアルゴリズムは,1秒の時間制限であれば完全に解決できる.
覚えたいこと
小数点を出力しようとしますが、常に後ろの特定の桁数から四捨五入し、数字が出力を遮断される現象が発生します.coutで小数点を特定の位置に出力したい場合に、精度関数で桁数を指定する方法について理解しました.
コード#コード#
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>

using namespace std;

double cache[1001][1001];

double snail(int depth, int days) {
	if (depth <= 1) return (double)1;
	double& ret = cache[depth][days];

	if (ret != -1) return ret;
	if (depth <= 1) return ret = (double)1;
	if (days == 1) {
		if (depth >= 3) return ret = 0;
		else if (depth == 2) return ret = (double)3 / 4;
		else return ret = (double)1;
	}

	ret = (0.25 * snail(depth - 1, days - 1)) + (0.75 * snail(depth - 2, days - 1));

	return ret;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int testcase;
	cin >> testcase;
	while (testcase--) {
		int n, m;
		cin >> n >> m;
		fill_n(cache[0], 1002001, -1);
		double ret = snail(n, m);
		cout.precision(11);
		cout << ret << "\n";
	}
	return 0;
}