蓄水库
hzj老家有一个蓄水库!2020鼠年不利,干旱出现了!政府决定,每天抽水救灾100吨,水库有自己的意念,坚持每天自然出水30吨!这样过了n天后,蓄水库还有s吨水!!问蓄水库在干旱出现前有多少吨水?
追及问题,每次追及路程是70/天,然后乘以天数加上剩余就好
#include<bits/stdc++.h>
using namespace std;
long long n,s;
int main()
{
cin>>n>>s;
cout<<70*n+s;
return 0;
}
数字三角变形1
数字三角形
要求走到最后mod 100最大
用dp[i][j][k]表示第i行j个mod100=k的状态能不能达到,然后三次循环地推
using namespace std;
int n,dp[35][35][105],a[35][35];
int ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
dp[1][1][a[1][1]]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
for(int k=0;k<=99;k++)
if(dp[i-1][j][k]||dp[i-1][j-1][k])dp[i][j][(k+a[i][j])%100]=1;//状态转移
for(int i=1;i<=n;i++)
for(int j=99;j>=0;j--)
if(dp[n][i][j])ans=max(ans,j);
cout<<ans;
return 0;
}
分发黄金
设立状态,dp[i]表示的是到i这个位置,获得的最大价值,然后往后面推,或者从前面推过来,注意不要超边界
#include<bits/stdc++.h>
using namespace std;
int n,s,t,a[1500],dp[1500];
int main()
{
cin>>n>>s>>t;
for(int i=1;i<=n;i++)cin>>a[i];
dp[1]=a[1];
for(int i=2;i<=n;i++)
{
for(int j=s;j<=t;j++)
if(i-j>=1)//从1推过来
dp[i]=max(dp[i],dp[i-j]+a[i]);
}
cout<<dp[n];
return 0;
}