不确定行数和列数的矩阵输入

1. 回车会刷新缓冲区,刷新缓冲区时才进行真正的IO操作。(其他刷新缓冲区的方式:缓冲区满,设置立即刷新等)

2. 如果设置读入整数,空格、制表符、回车都视为分隔符,但是输入其他的字符就会停止接下来读入。

3. 将ofstream的模式设为ofstream::app或ofstream::in会保留原有文件中的内容。

4. 因为输入输出都是流的格式,所以返回的是流对象,可以 in<<object1<<object2 连续操作。

#include<iostream>
#include<vector>
using namespace std;

int main() {
    int a = 0;
    vector<vector<int>> matrix;
    vector<int> ele;
    while(cin>>a) {
        if(getchar() == '\n') {
            matrix.push_back(ele);
            ele.clear();
        }
        ele.push_back(a);
    }
    return 0;
}

又一次碰到了不确定输入,应该把换行符放到后面判断。

        vector<int> preorder;
        int a = 0;
        while(cin>>a) {
            preorder.push_back(a);
            if(getchar() == '\n')
                break;
        }

 

### 回答1: 以下是用动态规划思想解决矩阵连乘问题的 C++ 代码: ```c++ #include <iostream> #include <vector> using namespace std; void matrixChainOrder(vector<int>& p, vector<vector<int>>& m, vector<vector<int>>& s) { int n = p.size() - 1; for (int i = 1; i <= n; ++i) { m[i][i] = 0; } for (int len = 2; len <= n; ++len) { for (int i = 1; i <= n - len + 1; ++i) { int j = i + len - 1; m[i][j] = INT_MAX; for (int k = i; k <= j - 1; ++k) { int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]; if (q < m[i][j]) { m[i][j] = q; s[i][j] = k; } } } } } void printOptimalParens(vector<vector<int>>& s, int i, int j) { if (i == j) { cout << "A" << i; } else { cout << "("; printOptimalParens(s, i, s[i][j]); printOptimalParens(s, s[i][j] + 1, j); cout << ")"; } } int main() { int n; cin >> n; vector<int> p(n + 1); vector<vector<int>> m(n + 1, vector<int>(n + 1)); vector<vector<int>> s(n + 1, vector<int>(n + 1)); for (int i = 0; i <= n; ++i) { int row, col; char comma; if (i == 0) { cin.ignore(); } cin >> row >> comma >> col; p[i] = row; if (i == n) { p[n] = col; } } matrixChainOrder(p, m, s); cout << m[1][n] << endl; printOptimalParens(s, 1, n); return 0; } ``` 输入格式,第一行输入矩阵个数。第二行开始,每行输入一个矩阵行数列数,用逗号分隔行数列数。输出格式,第一行输出断点位置处的最小乘数个数,第二行输出最优断点位置的括号化方案。 ### 回答2: 矩阵连乘问题是一个经典的动态规划问题,可以使用C语言来解决。下面是一个描述该问题的C程序: ```c #include <stdio.h> #include <stdlib.h> // 矩阵链乘法 void matrixChainMul(int* p, int n) { // 创建动态规划表 int m[n][n]; int s[n][n]; // 初始化动态规划表 for (int i = 1; i <= n; i++) { m[i][i] = 0; } // 进行动态规划计算 for (int l = 2; l <= n; l++) { for (int i = 1; i <= n - l + 1; i++) { int j = i + l - 1; m[i][j] = (1 << 30); for (int k = i; k <= j - 1; k++) { int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]; if (q < m[i][j]) { m[i][j] = q; s[i][j] = k; } } } } // 输出断点位置和乘法次数 printf("断点位置: "); printOptimalParens(s, 1, n); printf("\n乘法次数: %d\n", m[1][n]); } // 输出最优矩阵链的断点位置 void printOptimalParens(int s[][], int i, int j) { if (i == j) { printf("A%d", i); } else { printf("("); printOptimalParens(s, i, s[i][j]); printOptimalParens(s, s[i][j] + 1, j); printf(")"); } } int main() { int n; // 矩阵个数 scanf("%d", &n); int p[n + 1]; // 存放矩阵行数列数 for (int i = 0; i <= n; i++) { scanf("%d,%d", &p[i][0], &p[i][1]); } matrixChainMul(p, n); return 0; } ``` 该程序首先读取输入矩阵个数和每个矩阵行数列数,然后使用动态规划算法计算出最优的断点位置和乘法次数,最后将断点位置和乘法次数输出。 注意:上面给出的程序是一个伪代码示例,可能存在一些语法错误。具体的实现需要根据具体的编译环境进行调整。 ### 回答3: 矩阵连乘问题是在给定一系矩阵的情况下,确定它们相乘的最佳顺序,使得计算乘积的代价最小。这个问题可以通过动态规划的方法来解决。 首先,我们需要读取输入数据,第一行为矩阵的个数,后面的每一行为矩阵行数列数,用逗号分隔。我们可以使用一个数组来存储每个矩阵行数列数。 接下来,我们定义一个二维数组dp用来存储间结果,dp[i][j]表示从矩阵i到矩阵j的连乘最小代价。初始化将所有dp[i][i]的值设置为0,表示单独一个矩阵的乘积代价为0。 然后,我们使用一个循环来依次计算每个矩阵链的乘积代价。循环的长度从2开始,逐渐增加到矩阵的个数。在每次循环,我们遍历所有可能的断点位置k,计算不同断点位置的乘积代价,并更新最小值到dp数组。具体的计算方式为dp[i][j] = min{dp[i][k] + dp[k+1][j] + p[i-1] * p[k] * p[j]},其p[i-1]*p[k]*p[j]表示矩阵链i到j的乘积的代价。 最后,我们可以通过dp[1][n]的值来得到最终的乘积代价,其n为矩阵的个数。此外,我们还可以通过倒推dp数组的方式来确定具体的断点位置,从而得到乘数个数。 总之,使用C语言解决矩阵连乘问题的步骤是读取输入数据,初始化dp数组,计算乘积代价并更新dp数组,最后输出断点位置和乘数个数。代码实现需要注意边界条件的处理和数组下标的转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值