dp-cf-F-风王之瞳
题干:
F. 风王之瞳
time limit per test1.0 s
memory limit per test256 MB
inputstandard input
outputstandard output
如果莫名流泪,也许是失去了什么美好的回忆。
伪装成人类少女夏弥的龙王耶梦加得曾在暗中默默观察了这个名叫楚子航的男孩很多年。后来,她以学妹的身份正面出现在楚子航身边,一边作战,一边还讲着白烂的吐槽。她将利爪刺进他的胸膛,他也将折刀送入她的心口,他们紧紧相拥,像是最亲密的恋人。他最终来到了她生活过的小屋,仰面躺在床上,阳光温软,但眼泪却没有止住。爱唱歌的女孩被埋在花下了,连带着她的野心、和谜一样的往事。终于有一天有人问起他是不是喜欢她,他用一个问题回避了:“你们都叫她小龙女吗?”
后来,他每天都来看她曾经生活过的小屋,期待着那个虚幻的影子。终于有一天日暮,他又来到了这里,然而却被一串嬉笑声吸引——一个穿着天蓝色校服的女孩在和一个像是痴呆的哥哥在花园旁的空地上画着网格玩。
突然,女孩向它招手:“楚师兄,一起来玩格点正方形的游戏嘛?”
一脸惊喜表情的楚子航却有些疑惑那是什么游戏,她真的是越来越融入人类生活了啊…
“我来画一个 n×m 的网格图,师兄你来数一数上面有多少个正方形呀”,她调皮地眨着眼睛。
夕阳的余晖下,三人的影子显得非常的和谐。
Input:
第一行输入一个正整数 T (1≤T≤100),表示数据组数。
接下来 T 组数据,每组数据输入两个正整数 n 和 m (1≤n,m≤105),由空格间隔开,表示这个网格图的长为 n,宽为 m。
Output:
对于每组数据,请输出一个非负整数,表示这个网格图中有多个本质不同的格点正方形,注意换行。
Example:
inputCopy:
2
1 1
2 2
outputCopy:
1
6
Note:
格点正方形:在 n×m 的网格图中,四个顶点都在格点上的正方形叫做格点正方形。
本质不同:若两个格点正方形它们至少有一个顶点不重合在同一个格点上,则将它们称作本质不同的格点正方形。
dp思路:
一个nm的网格,以1~ n条边来dp,最后nm网格内正方形的总数几位1~n每条边上
正方形数的和。什么叫一条边上的正方形?就是正方形至少有一个点再这条边上。
如何dp:第一条边它只有11的正方形,即d[1]=m;第二条边它上面的正方形
有11、22的正方形,11的形况与d[i]一致,则d[2]=d[1]+(m-2+1)2;
第三条边上的正方形有11、22、33,11、22的情况与d[2]一致,
则d[2]=d[2]+(m-3+1)*3;到此不难看出i<=m时dp方程为d[i]=d[i-1]+(m-i+1)*m,
i>m时d[i]=d[i-1];
最后答案ans=d[1]+…+d[n].
dp题解:
#include<iostream>
using namespace std;
const int MAXN=1e5+10;
int main()
{
int t,n,m;
long long ans[105];
cin>>t;
int j=0;
int h=t;
while(h--)
{
cin>>n>>m;
long long _dp[MAXN];
long long sum=0;
_dp[1]=m;
sum+=_dp[1];
for(int i=2;i<=n;i++)
{
if(i<=m)
_dp[i]=_dp[i-1]+(m-i+1)*i;
else _dp[i]=_dp[i-1];
sum+=_dp[i];
}
cout<<sum<<endl;
}
}
一般思路(找规律):
给出n*m的格子,问里面有多少个正方形
2 2 答案 是6
第6个是斜着的。
找规律:如图.excel 画图太麻烦了,直接写草稿纸上了,这个自己画一遍基本就懂了
(啊,这个是我厚颜无耻的盗了实验室学长的图跟思路)
`
找规律题解:
#include<iostream>
using namespace std;
int main()
{
int t,n,m;
cin>>t;
while(t--)
{
long long ans=0;
cin>>n>>m;
int i=1;
int j=1;
while(i<=m&&i<=n)
{
ans+=(m-i+1)*(n-i+1)*i;
i++;
}
cout<<ans<<endl;
}
}