SNAIL(カタツムリ)
2274 ワード
(ソース)https://algospot.com/judge/problem/read/SNAIL
1回の場合に発生する2つのケースを統合
DP問題を解くと,一度の場合に発生する可能性のある特定の状況をすべて加算し,所望の答えを算出する場合が多く,このような場合は再帰的に問題を解決することが多い.この問題は1日雨が降らない場合と雨が降らない場合に分けられ、それぞれ帰郷して解決した後、最終的に合併して解決する.
覚えたいこと
小数点を出力しようとしますが、常に後ろの特定の桁数から四捨五入し、数字が出力を遮断される現象が発生します.coutで小数点を特定の位置に出力したい場合に、精度関数で桁数を指定する方法について理解しました.
コード#コード#
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;
}
Reference
この問題について(SNAIL(カタツムリ)), 我々は、より多くの情報をここで見つけました https://velog.io/@dlsghl92/SNAIL달팽이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol