Josephina and RPG(2013长沙赛区)

本文解析了一个常见的动态规划问题,通过记忆化搜索避免重复计算,确保算法效率。针对最多120个队伍对阵10000个敌人的场景,讨论了如何优化选择策略以减少时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个dp 也经常见的。 只不过自己想错了。 对于一个状态 有两种决策。 是否换队。 自己以为对于 10000个敌人。


会有2^10000 的选择。 肯定会超时。 但是事实不是这样的。  dp【i】【j】  这是队伍 i  对于 敌人 j 的时候的概率。 那么 i最大 120(最多120个队伍) j最大为10000


那么  最大的可能搜索 120*10000次(记忆化搜索) 就不会超时了。  这还是自己 对记忆化理解的不深吧


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cmath>
#include <iomanip>
typedef long long LL;
typedef unsigned long long LLU;
const double PI=acos(-1.0);
using namespace std;
#define MAXN 10000+10
#define INF 1<<30
int vis[125][MAXN] = {0};
double d[125][MAXN];
double mat[200][200];
int tar[MAXN];
int m,n;
double dp(int i, int j){
    if(j == m-1 || i >= n || i < 0)
        return 1;
    if(vis[i][j])
        return d[i][j];
    vis[i][j] = 1;
    d[i][j] = max(dp(i,j+1)*mat[i][tar[j+1]], dp(tar[j],j+1)*mat[tar[j]][tar[j+1]]);
    return d[i][j];
}
int main (){
    int r[20] = {0,0,0,1,4,10,20,35,56,84,120};
    while(scanf("%d",&n) != EOF){
        n = r[n];
        memset(vis,0,sizeof(vis));
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++)
                scanf("%lf",&mat[i][j]);
        scanf("%d",&m);
        for(int i = 0; i < m; i++)
            scanf("%d",&tar[i]);
        double ans = -1;
        for(int i = 0; i < n; i++){
            ans = max(ans, dp(i, 0)*mat[i][tar[0]]);
        }
        printf("%lf\n",ans);
    }
    return 0;
}

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值