#include<iostream> #include<math.h> #include <string.h> using namespace std; //命名空间 int main(){ int n,m; //n为木头数量,m为河对岸在数轴上的位置 cin>>m>>n; int dis[234][234]; //定义二维数组 for(int i=0;i<=m;i++){ for(int j=1;j<=m;j++){ dis[i][j]=abs(i-j); //计算绝对值 } } for(int i=0;i<n;i++){ //走的木头的长度 int x,y; cin>>x>>y; dis[x][y]=1; } for(int i=m;i>=0;i--){ for(int j=0;j<=m;j++){ for(int k=0;k<=m;k++){ dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]); } } } cout<<dis[0][m]; }
时间: 2024-03-28 18:37:26 浏览: 110
这是一段C++代码,主要实现了一个木筏过河问题的动态规划算法。代码主要包含以下几个步骤:
1. 输入河对岸在数轴上的位置m和木头数量n;
2. 定义一个二维数组dis,用来存储每个位置之间的距离;
3. 通过两层循环计算出每个位置之间的距离,并存储到dis数组中;
4. 通过一层循环,将每个木头的位置标记为1,表示在该位置有一块木头;
5. 通过三层循环,计算出每个位置之间的最小距离,即动态规划的核心算法;
6. 输出从位置0到河对岸在数轴上的位置m的最小距离。
需要注意的是,代码中有一个二维数组dis,其大小为234 * 234,这是因为可能有234个位置,而且每个位置都要计算到其他位置的距离。另外,代码中使用了命名空间std,表示使用标准命名空间。
相关问题
#include<math.h> #include<algorithm> #include<time.h> #include<stdlib.h> #include<iostream> #include<string.h> #include<map> #include<list> #include<string> #include<queue> #include<set> #include<vector> #include<stack> #include<limits> #define re register #define iosgo() std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define run(i,n) for (int i = 1; i <= n; i++) #define cin std::cin #define cout std::cout #define ll long long #define endl "\n" using namespace std; typedef pair<int, int>pll; const int N = 2e6 + 10; pll c[N]; int h[150][150]; int x[N], y[N], dp[N], ss[N]; int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } signed main() { string a; cin >> a; string b; cin >> b; if (a[0] == '0' || b[0] == '0') { cout << "0\n"; return 0; } int lena = a.length(); int lenb = b.length(); for (int i = 0; i < lena; i++) { x[i] = a[i] - '0'; } for (int i = 0; i < lenb; i++) { y[i] = b[i] - '0'; } int len = lena + lenb - 1; int r = 0; while (r < lenb) { for (int i = r, j = 0; i < lena + r; i++, j++) { ss[i] += x[j] * y[r]; } r++; } for (int i = len; i > 0; i--) { if (ss[i] >= 10) { ss[i - 1] += ss[i] / 10; ss[i] %= 10; } } for (int i = 0; i < len; i++) { cout << ss[i]; } }
这段代码是一个实现两个大整数相乘的程序。代码首先读取两个大整数a和b,然后将其转换为整型数组x和y。接下来,代码计算两个整数的乘积,并将结果存储在数组ss中。最后,代码将结果输出。
注意,这段代码没有考虑负数的情况,且对于较大的整数可能会导致溢出。如果需要处理更大的整数,可以考虑使用其他大数库或算法来实现。
#include "math.h" #include "stdio.h" #include <iostream> #include <cstdlib> #include <fstream> #include <strstream> #include <iomanip> #include <cmath> #include <string> #include <ctime> #include <sstream> using namespace std; //本程序要求BB[TG][TG]的逆矩阵,方法是构造一个单元矩阵BBN[TG][TG]。让BB[TG][TG]在一系列的线性变换下变为单元矩阵,则BBN[TG][TG]在相应线性变换下就会变为 //BB[TG][TG]的逆矩阵。 #define f(x) (2*(x)*(x)*(x)-(x)-1) #define f1(x) (((x)+1)/2.0) #define TG 7 #define Max 100 double F[TG],F1[TG]; int change; double X[Max+1]; double highf,lengthf; double s; void Deidai() { int i,j,k,k1; double i1,s; int mid2; int Time; /* for(i=0;i<TG;i++) { for(j=0;j<TG;j++) printf("%f ",BB[i][j]); printf("\n"); } */ X[0]=0; for(Time=0;Time<Max;Time++) {s=f1(X[Time]); X[Time+1]=pow(s,1/3.0); } } void main() { int i,j,k,I,J; Deidai(); for(i=1;i<=Max;i++) printf("X[%d=%f ",i,X[i]); }
这段代码是一个简单的C++程序,主要用于计算一个函数的零点。具体来说,它采用了递推的方式计算这个函数的零点,然后输出计算结果。
程序中用到了一些预定义的常量和宏定义,例如TG表示矩阵的大小,Max表示循环的最大次数。还用到了一些数学函数,例如pow函数和sqrt函数。
程序的主要函数是Deidai函数,它使用了一个递推公式计算函数的零点。具体来说,它先把X[0]初始化为0,然后循环计算X[1]到X[Max]的值。每次计算都是把前一次计算出来的值代入一个简单的递推公式,这个公式的形式是:s = f1(X[Time]); X[Time+1] = pow(s,1/3.0);
其中f1函数是一个简单的转换函数,它把X[Time]+1除以2得到一个新的值s。然后把s的1/3次方赋值给X[Time+1],这样就得到了一个递推序列,序列中的每个值都是函数f的零点的一个近似值。
最后,程序使用一个循环输出X数组中的值,这些值就是函数f的零点的近似值。
阅读全文