一:M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
Input
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000)
Output
输出走法的数量。
Input示例
2 3
Output示例
3
每次算得都是上方跟左方的和计算的,注意每次都要mod,不然会超范围
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
const int A=1e9+7;
ll dp[1011][1011];
int main()
{
ll n,m,i,a,o,T,j,k;
memset(dp,0,sizeof(dp));
cin>>m>>n;
ll maxx=max(m,n);
for(i=1;i<=maxx;i++)
dp[1][i]=1;
for(i=1;i<=maxx;i++)
dp[i][1]=1;
for(i=2;i<=1001;i++)
{
for(j=2;j<=1001;j++)
{
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%A;
}
}
cout<
二:最大子段和
N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
Input
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= A[i] <= 10^9)
Output
输出最大子段和。
Input示例
6
-2
11
-4
13
-5
-2
Output示例
20
假设最大字段和我们设为 M
我们设 1−j 中包括a[j]最大字段和为 b[j]
即:
b[j]=max{0,b[j−1]}+a[j]
我们求出包括a[i]−a[n]
的所有最大字段和后,只需要求出这些最大字段和中最大的那个就可以了!
即:
M=max b[j] 1≤j≤n
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
a[i] | 1 | 3 | -5 | 3 | -2 | 5 | -4 | 3 |
b[i] | 1 | 4 | -1 | 3 | 1 | 6 | -2 | 3 |
故可知 M=6
#include
#include
#include
#include
#include
#include
#include
#include
#include
三:数塔问题 https://blog.csdn.net/ZCY19990813/article/details/82467119
四:
一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。
例如:3 * 3的方格。
1 3 3
2 1 3
2 2 1
能够获得的最大价值为:11。
Input
第1行:N,N为矩阵的大小。(2 <= N <= 500)
第2 - N + 1行:每行N个数,中间用空格隔开,对应格子中奖励的价值。(1 <= N[i] <= 10000)
Output
输出能够获得的最大价值。
Input示例
3
1 3 3
2 1 3
2 2 1
Output示例
11
思路:转化成子问题,求上面跟前面最大的和自己相加。
#include
#include
#include
#include
using namespace std;
typedef long long ll;
ll p[10101];
ll w[10001];
ll a[1010][1010];
ll dp[1001][1001]={0};
int main()
{
ll n,i,j;
cin>>n;
for(i=0;i>a[i][j];
for(i=1;i
五: