【练习09】简单动态规划 1004 命运

本文介绍了一种基于动态规划的算法,用于解决一个特定类型的跳跃问题。该算法通过定义状态转移方程来求解最优路径,实现了从起点到终点的最大得分路径计算。文中提供了完整的C++代码实现,并详细解释了递推过程。

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

算法思路:动态规划

状态转移方程:score[i][j] = max{score[i + 1][j], score[i][j + 1], score[i][j * k]}, k > 1。

具体实现:采用递推的方法,先单独考虑边界值,接下来内层的方格用一个两层循环递推。


//模板开始
#include <string>   
#include <vector>   
#include <algorithm>   
#include <iostream>   
#include <sstream>   
#include <fstream>   
#include <map>   
#include <set>   
#include <cstdio>   
#include <cmath>   
#include <cstdlib>   
#include <ctime>
#include<iomanip>
#include<string.h>
#define SZ(x) (int(x.size()))
using namespace std;

int toInt(string s){
	istringstream sin(s); 
	int t; 
	sin>>t; 
	return t;
}
template<class T> string toString(T x){
	ostringstream sout; 
	sout<<x; 
	return sout.str();
}
typedef long long int64;
int64 toInt64(string s){
	istringstream sin(s); 
	int64 t; 
	sin>>t;
	return t;
}
template<class T> T gcd(T a, T b){ 
	if(a<0) 
		return gcd(-a, b);
	if(b<0) 
		return gcd(a, -b);
	return (b == 0)? a : gcd(b, a % b);
}
//模板结束(通用部分)

#define ifs cin

#define MAX_ROW 25
#define MAX_COL 1005
int cases;
int n, m;
int data[MAX_ROW][MAX_COL];
int score[MAX_ROW][MAX_COL];

void dp()
{
	score[n][m] = data[n][m];
	for(int i = n - 1; i >= 1; i--)
	{
		score[i][m] =  score[i + 1][m] + data[i][m];
	}
	for(int j = m - 1; j >= 1; j--)
	{
		score[n][j] = score[n][j + 1] + data[n][j];
	}

	for(int i = n - 1; i >= 1; i--)
	{
		for(int j = m - 1; j >= 1; j--)
		{
			score[i][j] = score[i + 1][j] + data[i][j];
			if(score[i][j + 1] + data[i][j] > score[i][j])
			{
				score[i][j] = score[i][j + 1] + data[i][j];
			}
			for(int k = 2; k * j <= m; k++)
			{
				if(score[i][k * j] + data[i][j] > score[i][j])
				{
					score[i][j] = score[i][k * j] + data[i][j];
				}
			}
		}
	}
}

//【练习09】简单动态规划 1003 Super Jumping! Jumping! Jumping!

int main()
{
	//ifstream ifs("shuju.txt", ios::in);
	ifs>>cases;
	for(int i = 0; i < cases; i++)
	{
		ifs>>n>>m;
		for(int j = 1; j <= n ; j++)
		{
			for(int k = 1; k <= m; k++)
			{
				ifs>>data[j][k];
			}
		}
		dp();
		cout<<score[1][1]<<endl;
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值