暑假算法7.15,Day14
线性DP
这个专题学校老师讲得很详细,所以写起来也很轻松。
期待更多的dp题目
第一题
最大字段和,经典的dp问题之一:
两种情况,一:后面数是负数 二:后面数是正数。
class Solution {
const int MAXX=1000008;
public:
int maxSubArray(vector<int>& nums) {
int dp[MAXX];
dp[0]=nums[0];
int MAX=dp[0];
for(int i=1;i<nums.size();i++){
dp[i]=max(dp[i-1]+nums[i],nums[i]);
MAX=max(MAX,dp[i]);
}
return MAX;
}
};
第二题
也是经典dp问题之一,还作为期末考试考过。应该很简单,就不多说了。
class Solution {
const int MAXX=10000008;
public:
int lengthOfLIS(vector<int>& nums) {
int dp[MAXX];
dp[0]=1;
int maxlen;
int maxx=dp[0];
for(int i=1;i<nums.size();i++){
maxlen=0;
for(int j=i-1;j>=0;j--){
if(nums[j]<nums[i]&&dp[j]>maxlen){
maxlen=dp[j];
}
}
dp[i]=maxlen+1;
if(dp[i]>maxx){
maxx=dp[i];
}
}
return maxx;
}
};
第三题
class Solution {
const int MAXX=1e9+7;
public:
int countHousePlacements(int n) {
long long dp[n+5];
dp[0]=2;
dp[1]=3;
if (n == 1) {
return dp[n-1]*dp[n-1];
}
if (n == 2) {
return dp[n-1] * dp[n-1];
}
for (int i = 2; i < n; ++i) {
dp[i] = (dp[i - 1] + dp[i - 2])%MAXX;
}
return (dp[n-1] * dp[n-1])%MAXX ;
}
};
第四题
走迷宫问题,不过这个迷宫只有两行,那么就很简单了,虽然他可以横走,竖走,斜走。我只需要判断它前面的那堵墙是不是被封死了就可以了。即:a[0][j]=='1'&&a[1][j]=='1'
墙被堵死了,再怎么走肯定也走不了了。
#include <bitsdc++.h>
using namespace std;
const int MAXX=1e5+5;
char a[2][MAXX];
bool solve(int n)
{
for(int i=0; i<2; i++)
{
for(int j=0; j<n; j++)
{
cin>>a[i][j];
}
}
bool flag=true;
for(int j=0; j<n; j++)
{
if(a[0][j]=='1'&&a[1][j]=='1')
{
flag=false;
break;
}
}
return flag;
}
int main()
{
int N;
cin>>N;
while(N--)
{
int n;
cin>>n;
bool result=solve(n);
if(result){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}